我正面临这个令人沮丧的问题,这个问题影响了我的数据收集速度。我已经为特定的体育网站编写了这个定制的网络剪贴簿,我从一个文件中读取了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 !!!
请帮帮我。谢谢社区
答案 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。