请推荐关于 Scrapy 包用法的中文版学习资料

2017-08-31 20:29:50 +08:00
 saximi
最好是能在断网环境下离线阅读的资料和电子书籍,万分感谢了!
2775 次点击
所在节点    Python
21 条回复
dsg001
2017-08-31 20:33:22 +08:00
fiht
2017-08-31 20:48:40 +08:00
搞爬虫的还能断网?
GreatMartial
2017-08-31 21:03:52 +08:00
@dsg001 厉害了,老哥
friejq
2017-08-31 22:15:52 +08:00
flamepeak
2017-08-31 22:24:43 +08:00
最近刚用 scrapy 写完一个小项目,把自己的一些经验写在博客上了,flamepeak.com 上了,可以看看,可以发邮件交流
saximi
2017-08-31 22:45:56 +08:00
@fiht 爬虫是自己学的,公司是断网的,唉
toono
2017-09-01 08:50:49 +08:00
辛苦了,公司竟然断网
friejq
2017-09-01 08:56:17 +08:00
@toono 我们办公室也不给接外网,我还以为很多都这样--.
toono
2017-09-01 09:11:22 +08:00
@friejq 😂你的公司是我知道的第一家。我同学们的公司都没有这样。

难道你们做金融的?
toono
2017-09-01 09:12:35 +08:00
@saximi 想问一句,公司断网,要这爬虫有何用(摔
hjl416148489
2017-09-01 12:01:24 +08:00
看学习资料还不如看 Python 视频教程,由浅入深,小白也能变大牛哈: http://www.sucaihuo.com/video/13.htmlhttp://www.sucaihuo.com/video/20.html
saximi
2017-09-01 20:13:44 +08:00
@toono 就算断网也有需要用爬虫的场合,只是对于我个人而言倒是工作上还没有用到,但是希望能多了解一门技术,所以排除困难也要学
saximi
2017-09-01 20:20:40 +08:00
@dsg001 请问这个下载后不是可以直接阅读的,还要在 LINUX 下编译才行? 我直接输入 ./Makefile htmlhelp 结果报错了,WINDOWS 下可以让这些文件变成可读的么?
toono
2017-09-02 01:03:33 +08:00
那不介意的话可以看看我在写的爬虫 https://github.com/ToonoW/TopicsSpiders
dsg001
2017-09-02 10:36:19 +08:00
@saximi 没编译过,http://scrapy-chs.readthedocs.io/zh_CN/latest/ 在线版,可以离线保存
fhefh
2017-09-02 17:21:47 +08:00
先 mark
saximi
2017-09-21 19:04:36 +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 的开启和关闭是在哪里设置的?

```
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。
saximi
2017-09-22 21:19:29 +08:00
@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,是不是这个类也不会起作用?
saximi
2017-09-22 21:44:46 +08:00
@toono 在您的代码中还有这一句,请问哪里可以找到 remove_tags 的用法说明呢,我在 baidu 和 bing 上用 python 加上 remove_tags 作为关键字竟然都找不到?

item['body'] = remove_tags(item['body'].extract_first(), which_ones=('span', ))

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

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

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

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

© 2021 V2EX