【发布时间】:2018-06-28 00:17:11
【问题描述】:
我创建了一个基本的蜘蛛来从 totaljobs.com 上抓取一小组工作列表。我已经使用一个起始 URL 设置了蜘蛛,以显示我感兴趣的作业列表。从那里,我为每个结果页面启动一个单独的请求。在这些请求中的每一个中,我都会启动一个单独的请求,回调到不同的解析方法,以处理各个作业 URL。
我发现起始 URL 和所有结果页面请求都得到了很好的处理——scrapy 连接到站点并返回页面内容。但是,当它尝试跟踪每个单独的工作页面的 URL 时,scrapy 无法建立连接。在我的日志文件中,它指出:
[<twisted.python.failure.Failure twisted.internet.error.ConnectionLost: Connection to the other side was lost in a non-clean fashion: Connection lost.>]
恐怕我没有大量的编程经验或互联网协议等知识,所以请原谅我无法提供更多关于这里可能发生的事情的信息。我尝试更改 TLS 连接类型;更新到最新版本的 scrapy、twisted 和 OpenSSL;回滚到以前版本的 scrapy、twisted 和 OpenSSL;回滚加密版本,创建自定义上下文工厂并尝试各种浏览器代理和代理。我每次都得到相同的结果:只要 URL 与特定的作业页面相关,scrapy 就无法连接,我得到上述日志文件输出。
我可能忽略了一些对经验丰富的爬虫来说非常明显的东西,这阻止了我与 scrapy 的联系。我已尝试遵循这些线程中的一些建议:
https://github.com/scrapy/scrapy/issues/1429
https://github.com/requests/requests/issues/4458
https://github.com/scrapy/scrapy/issues/2717
但是,其中一些有点超出我的想象,例如如何更新密码列表等。我认为这是某种认证问题,但是scrapy又能够连接到该域上的其他 URL,所以我不知道。
我用来测试的代码非常基本,但无论如何都在这里:
import scrapy
class Test(scrapy.Spider):
start_urls = [
'https://www.totaljobs.com/job/welder/jark-wakefield-job79229824'
,'https://www.totaljobs.com/job/welder/elliott-wragg-ltd-job78969310'
,'https://www.totaljobs.com/job/welder/exo-technical-job79019672'
,'https://www.totaljobs.com/job/welder/exo-technical-job79074694'
]
name = "test"
def parse(self, response):
print 'aaaa'
yield {'a': 1}
以上代码中的网址没有连接成功。
以下代码中的网址正在连接成功。
import scrapy
class Test(scrapy.Spider):
start_urls = [
'https://www.totaljobs.com/jobs/permanent/welder/in-uk'
,'https://www.totaljobs.com/jobs/permanent/mig-welder/in-uk'
,'https://www.totaljobs.com/jobs/permanent/tig-welder/in-uk'
]
name = "test"
def parse(self, response):
print 'aaaa'
yield {'a': 1}
如果有人可以复制这种行为(或者不是,视情况而定)并告诉我,那就太好了。请让我知道我是否应该提交其他详细信息。如果我忽略了一些非常明显的事情,我深表歉意。我正在使用:
Windows 7 64 位
Python 2.7
scrapy 版本 1.5.0
扭曲版本 17.9.0
openSSL 版本 17.5.0
lxml 版本 4.1.1
【问题讨论】:
-
也许该站点正在执行某种机器人检测并断开连接。
-
我怀疑是这种情况。我很想知道是否有任何方法可以准确地确定有哪些措施可以防止机器人进入。如果我知道我可以做哪些检查来检测这些措施,那么我可以完全避免为这些类型的网站编写爬虫,而不是设计一种方法来绕过蚂蚁抓取措施。
-
有几种检测机器人的措施,包括一些微妙的事情,比如浏览器发送标头的顺序。除非您将来自普通浏览器的流量与使用 Wireshark 之类的机器人进行比较,否则很难判断。
标签: python python-2.7 web-scraping scrapy python-requests