【问题标题】:dividing urllib2/beautifulsoup requests into smaller request packages将 urllib2/beautifulsoup 请求分成更小的请求包
【发布时间】:2018-04-20 09:50:36
【问题描述】:

我想收集一组关于搜索词“汽车”的专利 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 错误。我用谷歌搜索并找到了它:'

服务器当前无法处理请求,因为 服务器临时超载或维护。'

这是否意味着

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

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

【问题讨论】:

  • 这意味着您发布的请求和服务器处理它的方式出现问题,所以不是 1 也不是 2。

标签: beautifulsoup urllib2 urllib


【解决方案1】:

这是否意味着 (1) 不使用算法,而是手动组装 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))

现在的提示:数据库中的项目不超过 400 个,因此您可以停止第 4 页。如果得到结果,最好检查循环,如果没有则中断循环。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-27
    • 2015-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-12
    • 1970-01-01
    相关资源
    最近更新 更多