Python使用Scrapy框架爬取数据存入CSV文件

1. Scrapy框架

  Scrapy是python下实现爬虫功能的框架,能够将数据解析、数据处理、数据存储合为一体功能的爬虫框架。

2. Scrapy安装

1. 安装依赖包

 

2. 安装scrapy

 

 注意事项:scrapy和twisted存在兼容性问题,如果安装twisted版本过高,运行scrapy startproject project_name的时候会提示报错,安装twisted==13.1.0即可。

3. 基于Scrapy爬取数据并存入到CSV

3.1. 爬虫目标,获取简书中热门专题的数据信息,站点为https://www.jianshu.com/recommendations/collections,点击"热门"是我们需要爬取的站点,该站点使用了AJAX异步加载技术,通过F12键——Network——XHR,并翻页获取到页面URL地址为https://www.jianshu.com/recommendations/collections?page=2&order_by=hot,通过修改page=后面的数值即可访问多页的数据,如下图:

3.2. 爬取内容

  需要爬取专题的内容包括:专题内容、专题描述、收录文章数、关注人数,Scrapy使用xpath来清洗所需的数据,编写爬虫过程中可以手动通过lxml中的xpath获取数据,确认无误后再将其写入到scrapy代码中,区别点在于,scrapy需要使用extract()函数才能将数据提取出来。

3.3 创建爬虫项目

 

 3.4 代码内容

1. items.py代码内容,定义需要爬取数据字段

 

2. piders/jianshu_hot_topic_spider.py代码内容,实现数据获取的代码逻辑,通过xpath实现

 

3. pipelines文件内容,定义数据存储的方式,此处定义数据存储的逻辑,可以将数据存储载MySQL数据库,MongoDB数据库,文件,CSV,Excel等存储介质中,如下以存储载CSV为例:

 

4. 修改settings文件,

 

 3.5 运行scrapy爬虫

  返回到项目scrapy项目创建所在目录,运行scrapy crawl spider_name即可,如下:

 

查看/root/zhuanti.csv中的数据,即可实现。

 

4. 遇到的问题总结

1. twisted版本不见容,安装过新的版本导致,安装Twisted (13.1.0)即可

2. 中文数据无法写入,提示'ascii'错误,通过设置python的encoding为utf即可,如下:

 

 3. 爬虫无法获取站点数据,由于headers导致,载settings.py文件中添加USER_AGENT变量,如:

USER_AGENT="Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0"

 Scrapy使用过程中可能会遇到结果执行失败或者结果执行不符合预期,其现实的logs非常详细,通过观察日志内容,并结合代码+网上搜索资料即可解决。

我选择了豆瓣电影网站(https://movie.douban.com/)进行爬取,并对爬取的电影数据进行简单的数据分析。 首先,我们需要安装 Scrapy 框架。在命令行中输入以下命令: ``` pip install scrapy ``` 安装完成后,我们就可以开始编写爬虫了。 1. 创建 Scrapy 项目 在命令行中输入以下命令: ``` scrapy startproject douban_movie ``` 这样就会在当前目录下创建一个名为 douban_movie 的 Scrapy 项目。 2. 定义 Item 在 Scrapy 中,Item 是我们要爬取数据结构。在 douban_movie 目录下创建名为 items.py 的文件,并定义 MovieItem 类,如下所示: ```python import scrapy class MovieItem(scrapy.Item): title = scrapy.Field() # 电影名称 score = scrapy.Field() # 电影评分 director = scrapy.Field() # 导演 actors = scrapy.Field() # 演员 year = scrapy.Field() # 上映年份 country = scrapy.Field() # 制片国家/地区 ``` 3. 编写 Spider 在 Scrapy 中,Spider 是用来定义如何爬取某个网站的。在 douban_movie 目录下创建名为 movie_spider.py 的文件,并编写 MovieSpider 类,如下所示: ```python import scrapy from douban_movie.items import MovieItem class MovieSpider(scrapy.Spider): name = 'movie' allowed_domains = ['movie.douban.com'] start_urls = ['https://movie.douban.com/top250'] def parse(self, response): movie_list = response.xpath('//ol[@class="grid_view"]/li') for movie in movie_list: item = MovieItem() item['title'] = movie.xpath('.//span[@class="title"]/text()').extract_first() item['score'] = movie.xpath('.//span[@class="rating_num"]/text()').extract_first() item['director'] = movie.xpath('.//div[@class="bd"]/p/text()[1]').\ extract_first().replace('\n', '').split(' ')[1] item['actors'] = movie.xpath('.//div[@class="bd"]/p/text()[1]').\ extract_first().replace('\n', '').split(' ')[5].replace('...', '') item['year'] = movie.xpath('.//div[@class="bd"]/p/text()[2]').\ extract_first().replace('\n', '').split('/')[0].strip() item['country'] = movie.xpath('.//div[@class="bd"]/p/text()[2]').\ extract_first().replace('\n', '').split('/')[1].strip() yield item next_page = response.xpath('//span[@class="next"]/a/@href') if next_page: url = response.urljoin(next_page.extract_first()) yield scrapy.Request(url, callback=self.parse) ``` 在 MovieSpider 中,我们首先定义了爬虫的名称、允许爬取的域名和起始 URL。在 parse 方法中,我们使用 XPath 选择器获取电影列表中的每一部电影,并从中提取出电影名称、评分、导演、演员、上映年份和制片国家/地区等信息,最后将这些信息存入 MovieItem 中,并通过 yield 返回。 在最后,我们还使用 XPath 选择器获取下一页的 URL,并通过 scrapy.Request 发出请求,继续爬取下一页的数据。 4. 运行爬虫 在命令行中进入 douban_movie 目录,输入以下命令即可运行爬虫: ``` scrapy crawl movie -o movie.csv ``` 这样就会将爬取到的电影数据保存为名为 movie.csvCSV 文件。 5. 数据分析 我们使用 Pandas 进行数据分析。在 Python 中输入以下代码: ```python import pandas as pd df = pd.read_csv('movie.csv') print('电影数量:', len(df)) print('平均评分:', df['score'].mean()) print('导演数量:', len(df['director'].unique())) print('演员数量:', len(df['actors'].unique())) print('年份数量:', len(df['year'].unique())) print('国家/地区数量:', len(df['country'].unique())) ``` 这样就可以统计出爬取到的电影数量、平均评分、导演数量、演员数量、年份数量和国家/地区数量等信息。 完整代码如下:
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值