下面我来详细讲解Python利用Scrapy框架爬取豆瓣电影的攻略。
爬虫框架Scrapy简介
Scrapy是一款使用Python语言编写的开源网络爬虫框架,目的是帮助开发者高效地爬取Web站点的信息内容。它通过定制配置的方式对每个请求进行处理,从而实现高效率、快速的数据抓取。
Scrapy框架具有以下特点:
- 强大的抓取性能,支持异步处理和并发下载;
- 灵活的数据解析和导出能力;
- 可扩展性强,提供了丰富的插件机制。
爬取豆瓣电影
下面我们以爬取豆瓣电影为例,来讲解如何使用Scrapy框架爬取网站信息。
创建Scrapy项目
首先,我们需要在电脑中安装Scrapy框架,安装方式可以通过pip命令进行,具体命令如下:
pip install scrapy
安装完成后,我们就可以通过Scrapy框架创建我们的爬虫项目了。在命令行中执行如下命令:
scrapy startproject douban_movie
执行成功后,将会在命令行所在的目录下创建名为"douban_movie"的文件夹,这个文件夹中包含了Scrapy项目的基本结构。
分析网页结构
在开始编写爬虫程序之前,我们需要先分析豆瓣电影的网页结构,确定我们需要爬取哪些信息。为此,我们可以打开豆瓣电影的网页,并通过浏览器的开发者工具来查看网页的HTML代码和页面结构。
针对豆瓣电影的网页,我们可以发现,每部电影的信息都包含在一个class为"item"的div容器中。我们需要从这个容器中抓取详细信息,包括电影名称,导演,主演,评分等信息。
编写爬虫程序
有了网页结构的分析,接下来我们就可以开始编写我们的爬虫程序了。在"douban_movie/spiders"文件夹下,创建一个名为"douban_spider.py"的文件,并输入如下代码:
import scrapy
class DoubanSpider(scrapy.Spider):
name = 'douban'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
movie_list = response.xpath('//div[@class="item"]')
for movie in movie_list:
title = movie.xpath('div[@class="info"]/div[@class="hd"]/a/span/text()').extract_first()
star = movie.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first()
director = movie.xpath('div[@class="info"]/div[@class="bd"]/p[1]/text()').extract_first().strip().split(':')[-1].strip()
actors = movie.xpath('div[@class="info"]/div[@class="bd"]/p[2]/text()').extract_first().strip().split(':')[-1].strip()
yield {
'title': title,
'star': star,
'director': director,
'actors': actors
}
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)
代码解释如下:
- 首先通过import scrapy导入Scrapy框架。
- 编写DoubanSpider类,并定义了name,allowed_domains和start_urls这三个属性。
- 在parse方法中,我们通过XPath选取所有class为"item"的div容器,并依次获取每部电影的详细信息。
- 对于每部电影,我们使用XPath选取其电影名称、主演、导演和评分等信息,并通过yield返回一个字典形式的结果。
- 最后,我们在parse方法末尾通过XPath查询下一页的链接地址,并通过yield返回一个新的Request对象,让程序自动爬取下一页的数据。
运行爬虫程序
到此为止,我们的爬虫程序已经完成了。为了运行程序,我们需要打开命令行窗口,在项目文件夹下输入如下命令:
scrapy crawl douban -o movie.csv
运行完毕后,我们就可以在项目文件夹中看到一个名为"movie.csv"的文件,其中保存了我们爬取到的豆瓣电影的信息。我们也可以将数据格式化为JSON或其他形式的文件。
示例1:
上面给出的代码只能爬取豆瓣电影前25部,如果我们需要爬取前100部或者更多,我们只需要在start_urls中添加对应的链接即可。
例如,如果我们需要爬取前100部电影,可以将start_urls修改为如下形式:
start_urls = ['https://movie.douban.com/top250?start={}'.format(num) for num in range(0, 100, 25)]
代码解释如下:
- 将start_urls修改为一个列表形式,列表中包含4个URL链接,表示爬取豆瓣电影排名前100的电影。
- 修改首页URL为
'https://movie.douban.com/top250?start=0'
,并以25为步进值循环产生URL。
示例2:
上述代码中只爬取了电影的名称,导演、主演和评分,如果我们需要爬取更多的信息,我们需要通过XPath选取对应的HTML元素,并在代码中进行解析。
以下是一个简单的示例,假设我们需要爬取每部电影的时长信息,我们可以修改代码如下:
import scrapy
class DoubanSpider(scrapy.Spider):
name = 'douban'
allowed_domains = ['movie.douban.com']
start_urls = ['https://movie.douban.com/top250']
def parse(self, response):
movie_list = response.xpath('//div[@class="item"]')
for movie in movie_list:
title = movie.xpath('div[@class="info"]/div[@class="hd"]/a/span/text()').extract_first()
star = movie.xpath('div[@class="info"]/div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()').extract_first()
director = movie.xpath('div[@class="info"]/div[@class="bd"]/p[1]/text()').extract_first().strip().split(':')[-1].strip()
actors = movie.xpath('div[@class="info"]/div[@class="bd"]/p[2]/text()').extract_first().strip().split(':')[-1].strip()
duration = movie.xpath('div[@class="info"]/div[@class="bd"]/p[position()=3]/text()').extract_first().strip().split(':')[1].strip()
yield {
'title': title,
'star': star,
'director': director,
'actors': actors,
'duration': duration
}
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)
代码解释如下:
- 在代码中增加了一个新的duration属性,表示电影的时长。
- 通过XPath选取每部电影的时长信息,并添加到字典中返回。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python利用Scrapy框架爬取豆瓣电影示例 - Python技术站