将 urllib2/beautifulsoup 个请求分成更小的请求包

dividing urllib2/beautifulsoup requests into smaller request packages

我想要 assemble 一组关于搜索词 'automobile' 的专利 ID。我写了这段代码:

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 错误。我用谷歌搜索并找到它:'

The server is currently unable to handle the request due to a temporary overloading or maintenance of the server.'

这是否意味着

  1. 不使用算法,手动 assemble ID 或者
  2. 将请求分解成更小的块。

如果答案是 (2),我如何将其分解成更小的请求?

这是否意味着 (1) 不要使用算法,而是手动 assemble ID 或 (2) 将请求分解成更小的块。

都没有。

  1. 我不明白你说的是什么算法,但是不。
  2. 我不确定你所说的“更小的块”是什么意思,但还是不。

503 基本上意味着服务器太忙或有时离线。

当您 运行 您的脚本(或者如果您使用浏览器浏览网站)时,您会注意到服务器如何花费时间来处理单个请求,因此您可以猜测它是否难以处理单个请求请求,连续 100 个请求对您的目标来说有点太多了。

但是,前 16、17 或 18 次调用仍然效果很好。也许服务器只是需要在每次查询之间多一点时间来处理?

只需在您的文件顶部添加 import timetime.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))

现在protip:数据库中没有超过400个项目,所以你可以停止第4页。你最好检查你的循环,如果你有结果,如果没有打破循环。