将urllib2 / beautifulsoup请求分成较小的请求包

时间:2018-04-20 09:50:37

标签: beautifulsoup urllib2 urllib

我想组建一组关于搜索词“汽车”的专利ID。我写了这段代码:

./bin/ksql --config-file etc/ksql/ksql-server.properties -- http://127.0.0.1:9195

但是,我收到了503错误。我用Google搜索并发现它:'

  

由于a,服务器当前无法处理请求   暂时超载或维护服务器。'

这是否意味着

  1. 请勿使用算法,而是手动汇编ID或
  2. 将请求分解为更小的块。
  3. 如果答案是(2),我该如何将其分解为较小的请求?

1 个答案:

答案 0 :(得分:2)

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

都不是。

  1. 我不明白你在说什么算法,但没有。
  2. 我不确定“较小的块”是什么意思,但是再次没有。
  3. 503基本上意味着服务器太忙或有时离线。

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

    但是,第一次16,17或18次呼叫效果很好。也许服务器只需要在每个查询之间花一点时间来处理它?<​​/ p>

    只需在文件顶部import time添加time.sleep(10),然后在循环和利润结束时添加。{/ p>

    你肯定想在这里和那里添加一些日志,这是我的代码版本(我刚刚添加了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.你最好检查一下你的循环是否有结果,如果没有中断循环。< / p>