1
dsg001 2017-08-31 20:33:22 +08:00
|
2
fiht 2017-08-31 20:48:40 +08:00
搞爬虫的还能断网?
|
3
GreatMartial 2017-08-31 21:03:52 +08:00 via Android
@dsg001 厉害了,老哥
|
4
friejq 2017-08-31 22:15:52 +08:00 1
|
5
flamepeak 2017-08-31 22:24:43 +08:00 via Android
最近刚用 scrapy 写完一个小项目,把自己的一些经验写在博客上了,flamepeak.com 上了,可以看看,可以发邮件交流
|
7
toono 2017-09-01 08:50:49 +08:00
辛苦了,公司竟然断网
|
11
hjl416148489 2017-09-01 12:01:24 +08:00
看学习资料还不如看 Python 视频教程,由浅入深,小白也能变大牛哈: http://www.sucaihuo.com/video/13.html 和 http://www.sucaihuo.com/video/20.html
|
12
saximi OP @toono 就算断网也有需要用爬虫的场合,只是对于我个人而言倒是工作上还没有用到,但是希望能多了解一门技术,所以排除困难也要学
|
13
saximi OP @dsg001 请问这个下载后不是可以直接阅读的,还要在 LINUX 下编译才行? 我直接输入 ./Makefile htmlhelp 结果报错了,WINDOWS 下可以让这些文件变成可读的么?
|
14
toono 2017-09-02 01:03:33 +08:00
那不介意的话可以看看我在写的爬虫 https://github.com/ToonoW/TopicsSpiders
|
15
dsg001 2017-09-02 10:36:19 +08:00
@saximi 没编译过,http://scrapy-chs.readthedocs.io/zh_CN/latest/ 在线版,可以离线保存
|
16
fhefh 2017-09-02 17:21:47 +08:00
先 mark
|
17
saximi OP @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 的开启和关闭是在哪里设置的? ``` |
18
toono 2017-09-22 09:21:02 +08:00
@saximi
1. 这是看需求的,__init__方法的意义就是在于初始化。MyAgentMiddleware 中的__init__编写的意义在于记录我的 user_agent 的数目,方便后面的逻辑中使用 random 的随机方法。 2. 哈哈,这个是手误,原本打算用类似于 pipelines.py 中 MongoDBPipeline 的类初始化方法的,但是觉得直接写__init__方法更简便。 3. 我这里没有 return 语句实际上就是 return 了 None。 引用:如果其返回 None,Scrapy 将继续处理该 request,执行其他的中间件的相应方法,直到合适的下载器处理函数(download handler)被调用, 该 request 被执行(其 response 被下载)。 也就是我返回 None 的话,会继续按照 settings.py 的配置按顺序执行其他 Downloader Middleware。假如返回了 Response 对象,则会直接到达 spider 中 call_back 对应的方法进行返回的解析了。 4. 会有顺序,顺序就是 settings.py 中的优先级(数字)。为了爬虫群功能清晰,所以不同作用的功能分成不同的 Middleware 了。有的时候某个 Middleware 是某个爬虫特异需要的,那样子就可以做爬虫内配置去启用或者关闭 Middleware。有点拼乐高的意思。 像你说的合在一个类并非不行,只是不好。 5. 我认为开始爬虫的时候 spider 就是被开启的。你可以在 open_spider 方法调试输出,被调用的次数并不多。另外可以参考一下核心 API 状态收集器(Stats Collector) API。 |
19
saximi OP @toono 非常感谢您的耐心答复!关于您的爬虫代码,还有两个问题请教:
1、douban.py 中构造下一页网址的语句如下 next_page = response.xpath('//span[@class="next"]/a/@href').extract_first() next_page_url = self.start_urls[0] + next_page 从豆瓣首页来看,第一条语句运行后的结果是 next_page = 'https://www.douban.com/group/explore?start=30' 因为 start_urls = ['https://www.douban.com/group/explore'] ,所以 self.start_urls[0]就是 'https://www.douban.com/group/explore' 所以第二条语句运行即为 next_page_url = 'https://www.douban.com/group/explore' + 'https://www.douban.com/group/explore?start=30' 这明显就不是合法的 URL 了,请问我这个看法是否正确呢?谢谢 2、pipelines.py 中的 ImagesDownloadPipeline 类,没有实现 process_item()方法,这个类实际上是不会起作用的吧? pipelines.py 中 MongoDBPipeline 类的 process_item()方法并没有 return item,是不是这个类也不会起作用? |