由于URL的差异非常小,我的Web刮刀偶尔会失败

时间:2016-12-09 01:04:04

标签: python-2.7 url web-scraping beautifulsoup web-crawler

我正面临这个令人沮丧的问题,这个问题影响了我的数据收集速度。我已经为特定的体育网站编写了这个定制的网络剪贴簿,我从一个文件中读取了URL,然后打电话给我的刮刀:

import re
from bs4 import BeautifulSoup
import html5lib
import socket
from PassesData import *
import sys
reload(sys)
sys.setdefaultencoding('utf-8')

base: http://www.something.com
with open('Part2-PostIS-0430PM.txt', 'w') as f5:
    with open('URLLinks.txt') as temp:
        for url in temp:
            f5.write(getData(base+url))
            f5.write("\n")

URLLinks.txt中的示例数据 - > / something / where / 12345

抓取工具可以完美地工作几个小时,逐个读取网址并将其传递给抓取工具,并将结果返回到外部的文本文件 - >但是当它读取一个略有不同的URL时,如:

/ someting /其中/ 12345而不是/ something /其中/ 12345,

我的抓取工具失败了: UnboundLocalError:在分配之前引用的本地变量'header':标头是我从URL稀疏的页眉,如header = soup.h1.b.text.strip( )并将其传递给打印功能。它适用于我正在阅读的99%的URL,但中间的一个URL会导致整个过程停止,然后当我将URL传递给例如Google Chrome时,它会自动修复缺少的术语并获取正确的术语,例如,当我将“http://www.something.com/someting/wherein/12345”传递给Chrome时,它会打开/ something / where / 12345没有任何问题。在这里,我将更改URLlinks.txt中的一个URL,然后再次运行我的爬虫,这会导致我的数据收集出现大量延迟。

这导致了巨大的延迟,因为我必须经常照看这个过程。

我真的很感激任何解决方案。

我正在使用BeautifulSoup4和socket(不使用URLLIB和其他方法,因为他们只是不为我正在废弃的网站工作)

我必须再次强调我的抓取工具完美无缺,但对于网址的小小变化,就像/ this-is-a / link / to / 12345而不是/ this-is / link / to / 12345浏览器完全理解,但我的代码失败,即使我从一开始就从同一个网站收集了这些URL !!!

请帮帮我。谢谢社区

3 个答案:

答案 0 :(得分:0)

您可以使用网页抓取框架scrapy,我认为它也会因错误的网址而失败,但它不会停止该过程,因此其他请求仍然有效。它也是异步的,因此您的请求将被独立且更快地处理。

答案 1 :(得分:0)

实际上我做了一些不能解决问题的事情,但却是下一个最好的事情。它允许我在记录那些有问题的URL时继续搜索,以便稍后查找它们:我使用的代码如下:

with open('Part2-PostIS-Datas-7-1159AM.txt', 'w') as f5:
   log = open("LOG-P2-7-1159.txt", 'a')
   with open('Part2-Links-7.txt') as temp:
       for url in temp:
          try:
              f5.write(getData(base+url))
              f5.write("\n")
          except (KeyboardInterrupt, SystemExit):
              raise
          except:
              print(url, file=log )
              pass

现在我可以运行我的脚本并逐页扫描页面,1%有问题的URL不会停止整个过程。我的数据收集结束后,我将不得不查看我的LOG文件并修复URL并再次运行它们。

答案 2 :(得分:0)

真的不知道你用什么模块进行抓取,但在我身边requests可以正常使用你给我的例子:

>>> import requests
>>> response = requests.get('http://stackoverflow.com//questions/41051497/my-web-scraper-sporadically-due-very-small-difference-in-urls?noredirect=1#comment69311269_41051497')
>>> response.url
u'http://stackoverflow.com/questions/41051497/my-web-scraper-sporadically-fails-due-to-very-small-difference-in-urls?noredirect=1'
>>> response = requests.get('http://stackoverflow.com//questions/41051497/how-wrong-can-the-name-be?noredirect=1')
>>> response.url
u'http://stackoverflow.com/questions/41051497/my-web-scraper-sporadically-fails-due-to-very-small-difference-in-urls?noredirect=1'

正如你所看到的,无论什么样的"错误的名字"如果您提供,只要问题编号正确,响应将执行301并根据stackoverflow服务器请求重定向到正确的URL。