разделение запросов 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. Я погуглил и нашел: '

В настоящее время сервер не может обработать запрос из-за временной перегрузки или технического обслуживания сервера».

Это значит

  1. Не используйте алгоритм, вместо этого соберите идентификаторы вручную или
  2. Разбейте запрос на более мелкие части.

Если ответ (2), как мне разбить это на более мелкие запросы?


person Slowat_Kela    schedule 20.04.2018    source источник
comment
Это означает, что что-то пошло не так в отправленном вами запросе и в том, как сервер его обработал, поэтому ни 1, ни 2.   -  person Alper    schedule 20.04.2018


Ответы (1)


Означает ли это, что (1) не использовать алгоритм, а собирать идентификаторы вручную или (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