将 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.'
这是否意味着
- 不使用算法,手动 assemble ID 或者
- 将请求分解成更小的块。
如果答案是 (2),我如何将其分解成更小的请求?
这是否意味着 (1) 不要使用算法,而是手动 assemble ID 或 (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))
现在protip:数据库中没有超过400个项目,所以你可以停止第4页。你最好检查你的循环,如果你有结果,如果没有打破循环。
我想要 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.'
这是否意味着
- 不使用算法,手动 assemble ID 或者
- 将请求分解成更小的块。
如果答案是 (2),我如何将其分解成更小的请求?
这是否意味着 (1) 不要使用算法,而是手动 assemble ID 或 (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))
现在protip:数据库中没有超过400个项目,所以你可以停止第4页。你最好检查你的循环,如果你有结果,如果没有打破循环。