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

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

请问有满足上述条件的爬虫代码范例可供学习么?
非常感谢!
请问有没有这样的Python爬虫代码范例?

23 回复

scrapy webmagic 都可以吧,这些都是爬虫框架基本的功能要求。
另外实际来看,不要每次爬取随机选择 UA (第一条是说这个意思吧?


我无法理解你的问题。

第一条是说每次爬取从一个列表中选择其中一个 UA,而不是每次都固定用同一个 UA。
看过 scrapy 的说明文档,感觉内容比较庞杂,希望能结合具体完整的例子来学习爬虫,而且希望这个代码例子能实现我列出的这些功能。

这是每一个爬虫的基本功能,找一个爬虫都可以实现这些功能。

按照你的条件:
1、最好用 nodejs,而且 PhantomJS 是坑,可以考虑 chrome headless,已经有比较好的开源库了
2、第 1,3,4 条都很简单
3、第 2 不就是个代理池吗?

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 树去选取。然后就更加不是问题了。

============
以上内容面对新手,同样适用于简单爬虫。

我的意思是要避免这种情况,我的经验是 实际切换 UA 的话服务器很容易就发现这是爬虫行为。

建议用 scrapy 框架
1,2 两条可以去看 http://scrapoxy.io/
存储到数据库的话可以参考各大数据库的 python 驱动然后写到 pipeline 里




感谢各位的指点,提供的资料我要仔细看看,顿首拜!

楼上让新手用 scrapy 实现随机 UA 和代理 IP 你们是认真的么…

https://github.com/shisiying/tc_zufang
上面地址多打了 k,这是准确地址



我学习了您上传的爬虫代码,有一些问题想请您指点。万分感谢了!
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 的开启和关闭是在哪里设置的?

在您的爬虫代码中 from_crawler()方法里有这个语句

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

请问哪里可以找到对 signals.connect() 这个函数的详细用法说明?谢谢!

douban.py 这个代码是否是写得比较早,从现在的页面来看,下面的语句中 class 为 topic-content 的标签是不存在的?

item[‘body’] = response.xpath(’//div[class=“topic-content”]’)

不知为何,我点击“显示 Gist 代码”没有任何显示,直接把网址复制到浏览器也打不开,看不到代码呢

你需要 fq

您代码中的 DoubanCookieChangeMiddleware 类用于动态改变 cookie。但是在 douban.py 程序中并没有输入用户和密码的登录动作,为什么会有 cookie ?

我运行了一下豆瓣爬虫,没毛病,而且我去查看了有 topic-content class。关于 cookie 并不是需要登录用户才会有的。

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

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

太奇怪了,您爬虫主页是 https: //www.douban.com/group/explore,我无论是用 IE 还是 CHROME 浏览器访问这个页面,打开页面源码后都找不到“ topic-content ”这个字符串呢。
我用 FIDDLER 工具查看访问 https: //www.douban.com/group/explore 时的报文,点击 COOKIE 按钮时提示并无 COOKIE,是在不明白。

topic-content 是在帖子里面的,https: //www.douban.com/group/explore 是帖子列表。

回到顶部