请问有没有这样的爬虫代码范例

2017-09-20 20:54:18 +08:00
 saximi
实现爬虫功能的同时,也进行了以下处理:
1、修改了 HTTP 请求头,每次爬取时随机选择一个使用
2、将真实 IP 地址进行了屏蔽,每次爬取时从 IP 池中选择一个使用
3、初始访问页面是第一页,根据页面上的选择页控件,爬完当前页后接着爬取下一页直至全部爬取完毕
4、爬取的数据存储到数据库
5、最好能用到 PhantomJS 这个浏览器——这个条件不强求,但是有的话最好

请问有满足上述条件的爬虫代码范例可供学习么?
非常感谢!
2806 次点击
所在节点    Python
22 条回复
stcasshern
2017-09-20 21:05:34 +08:00
scrapy webmagic 都可以吧,这些都是爬虫框架基本的功能要求。
另外实际来看,不要每次爬取随机选择 UA (第一条是说这个意思吧?
saximi
2017-09-20 21:18:11 +08:00
@stcasshern 第一条是说每次爬取从一个列表中选择其中一个 UA,而不是每次都固定用同一个 UA。
看过 scrapy 的说明文档,感觉内容比较庞杂,希望能结合具体完整的例子来学习爬虫,而且希望这个代码例子能实现我列出的这些功能。
tonghuashuai
2017-09-20 21:33:35 +08:00
这是每一个爬虫的基本功能,找一个爬虫都可以实现这些功能。
keenwon
2017-09-20 21:37:19 +08:00
按照你的条件:
1、最好用 nodejs,而且 PhantomJS 是坑,可以考虑 chrome headless,已经有比较好的开源库了
2、第 1,3,4 条都很简单
3、第 2 不就是个代理池吗?
fiht
2017-09-20 21:53:08 +08:00
https://gist.github.com/anonymous/4a7f7d2c1efbbaaa515f0031cea9c4b2
写了个简单的,本地环境有问题没直接跑但是大概写了一下思路。能够实现楼主的大部分需求了。
楼上上来就说框架的未免有点太新手不友好了。
其实爬虫就两件事情,模拟用户访问,grep 出想要的内容然后保存起来。
模拟用户访问无非就是发送一个 http request,或者通过浏览器发送 JS 加密过的 http reqeust。这个每个语言都有自己的 http client,应该也是都有自定义类似 User-Agent 头、设置代理 IP 这样的功能。所以第一步的解决方案是看对应语言的 API 的 http client 如何自定义发送内容:比如讲上面说的自定义 UA,如何 POST 数据,如何设置代理 etc...
第二部保存起来,你可以写文件,写数据库,或者写入其他的存储引擎。我们通过第一步就得到 html 代码了,grep 出来可以用正则表达式,或者基于 dom 树去选取。然后就更加不是问题了。

============
以上内容面对新手,同样适用于简单爬虫。
dsg001
2017-09-20 22:00:03 +08:00
stcasshern
2017-09-20 22:04:43 +08:00
@saximi 我的意思是要避免这种情况,我的经验是 实际切换 UA 的话服务器很容易就发现这是爬虫行为。
hcnhcn012
2017-09-20 22:06:29 +08:00
建议用 scrapy 框架
1,2 两条可以去看 http://scrapoxy.io/
存储到数据库的话可以参考各大数据库的 python 驱动然后写到 pipeline 里
saximi
2017-09-20 22:39:23 +08:00
@fiht
@dsg001
@stcasshern
@hcnhcn012 @keenwon 感谢各位的指点,提供的资料我要仔细看看,顿首拜!
fiht
2017-09-20 22:40:57 +08:00
楼上让新手用 scrapy 实现随机 UA 和代理 IP 你们是认真的么...
seven2016
2017-09-20 23:02:59 +08:00
https://github.com/shisiying/tc_zufangk
这个范例可以参考下
seven2016
2017-09-20 23:09:38 +08:00
https://github.com/shisiying/tc_zufang
上面地址多打了 k,这是准确地址
toono
2017-09-21 08:59:50 +08:00
saximi
2017-09-21 19:24:07 +08:00
@toono

我学习了您上传的爬虫代码,有一些问题想请您指点。万分感谢了!
1、middlewares.py 中 MyAgentMiddleware 和 DoubanCookieChangeMiddleware 都是下载中间件,为何前者定义中声明了__init__方法,但后者却没有?

2、middlewares.py 中 MyAgentMiddleware 的__init__方法为什么要这个参数:user_agent=''

3、我看了 scrapy 0.25 的官方说明文档,里面提到:“ process_request() 必须返回其中之一: 返回 None、返回一个 Response 对象、返回一个 Request 对象或 raise IgnoreRequest ”
但是您的 MyAgentMiddleware 和 DoubanCookieChangeMiddleware 都没有 return 语句,这是为何?

4、既然 MyAgentMiddleware 和 DoubanCookieChangeMiddleware 都没有返回,这两个类中的 process_request()是否会依序先后被调用,如果会的话,把两个类合并为一个类,在一个类中实现所有的方法是否更合理?

5、pipelines.py 中有的类实现了 open_spider()这个方法,而只有当 spider 被开启时,这个方法被调用。请问 spider 的开启和关闭是在哪里设置的?
saximi
2017-09-21 19:48:39 +08:00
@toono 在您的爬虫代码中 from_crawler()方法里有这个语句

crawler.signals.connect(s.spider_opened, signal=signals.spider_opened)

请问哪里可以找到对 signals.connect() 这个函数的详细用法说明?谢谢!
saximi
2017-09-21 20:10:38 +08:00
@toono douban.py 这个代码是否是写得比较早,从现在的页面来看,下面的语句中 class 为 topic-content 的标签是不存在的?

item['body'] = response.xpath('//div[@class="topic-content"]')
saximi
2017-09-21 20:33:00 +08:00
@fiht 不知为何,我点击“显示 Gist 代码”没有任何显示,直接把网址复制到浏览器也打不开,看不到代码呢
fiht
2017-09-21 21:14:59 +08:00
@saximi 你需要 fq
saximi
2017-09-21 22:25:33 +08:00
@toono 您代码中的 DoubanCookieChangeMiddleware 类用于动态改变 cookie。但是在 douban.py 程序中并没有输入用户和密码的登录动作,为什么会有 cookie ?
toono
2017-09-22 09:46:44 +08:00
@saximi 我运行了一下豆瓣爬虫,没毛病,而且我去查看了有 topic-content class。关于 cookie 并不是需要登录用户才会有的。

关于 signal 你可以参看文档的 signal 一章及 http://scrapy-chs.readthedocs.io/zh_CN/1.0/topics/extensions.html?highlight=signals.connect

signal 我理解还是不够深入,所以先不多解释。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/392367

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX