前一篇文章介绍了很多关于scrapy的进阶知识,不过说归说,只有在实际应用中才能真正用到这些知识。所以这篇文章就来尝试利用scrapy爬取各种网站的数据。
爬取百思不得姐
首先一步一步来,我们先从爬最简单的文本开始。这里爬取的就是百思不得姐的的段子,都是文本。
首先打开段子页面,用F12工具查看元素。然后用下面的命令打开scrapyshell。
scrapy shell http://www.budejie.com/text/
稍加分析即可得到我们要获取的数据,在介绍scrapy的第一篇文章中我就写过一次了。这次就给上次那个爬虫加上一个翻页功能。
要获取的是用户名和对应的段子,所以在items.py中新建一个类。
class BudejieItem(scrapy.Item): username = scrapy.Field() content = scrapy.Field()
爬虫本体就这样写,唯一需要注意的就是段子可能分为好几行,这里我们要统一合并成一个大字符串。选择器的extract()方法默认会返回一个列表,哪怕数据只有一个也是这样。所以如果数据是单个的,使用extract_first()方法。
import scrapyfrom scrapy_sample.items import BudejieItemclass BudejieSpider(scrapy.Spider): """百思不得姐段子的爬虫""" name = 'budejie' start_urls = ['http://www.budejie.com/text/'] total_page = 1 def parse(self, response): current_page = int(response.css('a.z-crt::text').extract_first()) lies = response.css('div.j-r-list >ul >li') for li in lies: username = li.css('a.u-user-name::text').extract_first() content = '/n'.join(li.css('div.j-r-list-c-desc a::text').extract()) yield BudejieItem(username=username, content=content) if current_page < self.total_page: yield scrapy.Request(self.start_urls[0] + f'{current_page+1}')
导出到文件
利用scrapy内置的Feed功能,我们可以非常方便的将爬虫数据导出为XML、JSON和CSV等格式的文件。要做的只需要在运行scrapy的时候用-o参数指定导出文件名即可。
scrapy crawl budejie -o f.jsonscrapy crawl budejie -o f.csvscrapy crawl budejie -o f.xml
如果出现导出汉字变成Unicode编码的话,需要在配置中设置导出编码。
FEED_EXPORT_ENCODING = 'utf-8'
保存到MongoDB
有时候爬出来的数据并不想放到文件中,而是存在数据库中。这时候就需要编写管道来处理数据了。一般情况下,爬虫只管爬取数据,数据是否重复是否有效都不是爬虫要关心的事情。清洗数据、验证数据、保存数据这些活,都应该交给管道来处理。当然爬个段子的话,肯定是用不到清洗数据这些步骤的。这里用的是pymongo,所以首先需要安装它。
pip install pymongo
代码其实很简单,用scrapy官方文档的例子稍微改一下就行了。由于MongoDB的特性,所以这部分代码几乎是无缝迁移的,如果希望保存其他数据,只需要改一下配置就可以了,其余代码部分几乎不需要更改。
新闻热点
疑难解答