การแบ่งคำขอ urllib2/beautifulsoup ออกเป็นแพ็คเกจคำขอขนาดเล็ก

ฉันต้องการรวบรวมชุดสิทธิบัตรเกี่ยวกับคำค้นหา "รถยนต์" ฉันเขียนรหัสนี้:

import urllib2
from bs4 import BeautifulSoup
import sys
import StringIO
import re


search_term = 'automobile'
patent_list = []
for i in range(100): #for the first 100 pages of results
    web_page = 'https://www.lens.org/lens/search?q=' + str(search_term) + '&sat=P&l=en&st=true&p=' + str(i) + '&n=100'
    page = urllib2.urlopen(web_page)
    soup = BeautifulSoup(page,'html.parser')

    for aref in soup.findAll("a",href=True):
        if re.findall('/lens/patent',aref['href']):
            link = aref['href']
            split_link = link.split('/')
            if len(split_link) == 4:
                patent_list.append(split_link[-1])

print '\n'.join(set(patent_list))

อย่างไรก็ตาม ฉันได้รับข้อผิดพลาด 503 ฉันค้นหาสิ่งนี้ใน Google และพบว่า: '

ขณะนี้เซิร์ฟเวอร์ไม่สามารถจัดการคำขอได้เนื่องจากการโอเวอร์โหลดชั่วคราวหรือการบำรุงรักษาเซิร์ฟเวอร์'

นี่หมายความว่า.

  1. อย่าใช้อัลกอริธึม ให้ประกอบ ID ด้วยตนเองแทน หรือ
  2. แบ่งคำขอออกเป็นชิ้นเล็กๆ

หากคำตอบคือ (2) ฉันจะแบ่งคำขอนี้เป็นคำขอเล็กๆ ได้อย่างไร


person Slowat_Kela    schedule 20.04.2018    source แหล่งที่มา
comment
หมายความว่ามีบางอย่างผิดพลาดในคำขอที่คุณโพสต์ และวิธีที่เซิร์ฟเวอร์ประมวลผลคำขอดังกล่าว ไม่ใช่ทั้ง 1 หรือ 2   -  person Alper    schedule 20.04.2018


คำตอบ (1)


หมายความว่า (1) อย่าใช้อัลกอริทึม ประกอบ ID ด้วยตนเองแทน หรือ (2) แบ่งคำขอออกเป็นส่วนย่อยๆ

ไม่ใช่ทั้งสองอย่าง.

  1. ฉันไม่เข้าใจว่าคุณกำลังพูดถึงอัลกอริธึมอะไร แต่ก็ไม่
  2. ฉันไม่แน่ใจว่า "ชิ้นเล็กกว่า" ของคุณหมายถึงอะไร แต่ก็ไม่ใช่อีกครั้ง

โดยทั่วไปแล้ว 503 หมายความว่าเซิร์ฟเวอร์ยุ่งเกินไปหรือบางครั้งก็ออฟไลน์

เมื่อคุณเรียกใช้สคริปต์ (หรือหากคุณเรียกดูเว็บไซต์ด้วยเบราว์เซอร์ของคุณ) คุณจะสังเกตเห็นว่าเซิร์ฟเวอร์ใช้เวลาในการจัดการคำขอเดียวอย่างไร ดังนั้นคุณจึงสามารถเดาได้ว่าเซิร์ฟเวอร์มีปัญหาในการจัดการคำขอเดียวหรือไม่ คำขอ 100 รายการติดต่อกันคือ มากเกินไปสำหรับเป้าหมายของคุณเล็กน้อย

แต่ถึงกระนั้นการโทร 16, 17 หรือ 18 ครั้งแรกก็ใช้งานได้ดี บางทีเซิร์ฟเวอร์อาจต้องการเวลาเพิ่มขึ้นอีกเล็กน้อยระหว่างแต่ละแบบสอบถามเพื่อจัดการกับสิ่งนั้น

เพียงเพิ่ม import time ที่ด้านบนของไฟล์ time.sleep(10) และจุดสิ้นสุดของวงจรและกำไรของคุณ

คุณต้องการเพิ่มบันทึกที่นี่และที่นั่น นี่คือโค้ดเวอร์ชันของฉัน (ฉันเพิ่งเพิ่ม time.sleep() + งานพิมพ์บางส่วน)

import urllib2
from bs4 import BeautifulSoup
import sys
import StringIO
import re
import time


search_term = 'automobile'
patent_list = []
for i in range(100): #for the first 100 pages of results
    web_page = 'https://www.lens.org/lens/search?q=' + str(search_term) + '&sat=P&l=en&st=true&p=' + str(i) + '&n=100'
    print('fetching {} ({})'.format(i, web_page))
    page = urllib2.urlopen(web_page)
    print('webpage fetched')
    soup = BeautifulSoup(page,'html.parser')

    for aref in soup.findAll("a",href=True):
        if re.findall('/lens/patent',aref['href']):
            link = aref['href']
            split_link = link.split('/')
            if len(split_link) == 4:
                patent_list.append(split_link[-1])

    print('sleeping ten seconds')
    time.sleep(10)
print '\n'.join(set(patent_list))

ตอนนี้คำแนะนำเบื้องต้น: มีรายการไม่เกิน 400 รายการในฐานข้อมูล ดังนั้นคุณจึงสามารถหยุดหน้า 4 ได้ คุณควรตรวจสอบในลูปของคุณหากคุณได้รับผลลัพธ์ และหากไม่ทำลายลูป

person Arount    schedule 20.04.2018