Scrapy使用案例——爬取豆瓣Top 250电影数据
什么是Scrapy?
Scrapy是一个基于Python的强大的开源网络爬虫框架,用于从网站上抓取信息。它提供了广泛的功能,使得爬取和分析数据变得相对容易。Scrapy的特点包括:
- 强大的数据提取工具,支持XPath和CSS选择器。
- 简化的HTTP请求和响应处理。
- 可配置的下载中间件,用于处理不同类型的请求。
- 数据存储支持,包括JSON、CSV、XML等。
- 并发请求管理,提高效率。
创建Scrapy项目
要使用Scrapy来爬取网站,首先需要创建一个Scrapy项目。下面是创建一个名为douban_top250的Scrapy项目的步骤:
- 打开终端,导航到您想要创建项目的目录,并运行以下命令:
scrapy startproject douban_top250
- 进入项目目录:
cd douban_top250
- 创建一个用于爬取电影信息的Spider:
scrapy genspider douban_movie douban.com
现在,项目的基本结构已经创建,包括爬虫(Spider)模板文件。
编写Scrapy Spider
Spider是Scrapy项目中负责定义如何抓取信息的部分。需要编辑Spider文件,以指定要爬取的URL、如何处理响应和如何提取数据。
以下是一个示例Spider代码:
import scrapy
from douban_top250.items import DoubanTop250Item
class DoubanMovieSpider(scrapy.Spider):
name = 'douban_movie' # Spider的名称
allowed_domains = ['douban.com'] # 允许爬取的域名
start_urls = ['https://movie.douban.com/top250'] # 起始URL
def parse(self, response):
for movie in response.css('ol.grid_view li'):
item = DoubanTop250Item() # 创建一个DoubanTop250Item对象用于存储数据
item['rank'] = movie.css('em::text').get() # 提取电影排名
item['title'] = movie.css('.title::text').get() # 提取电影标题
item['rating'] = movie.css('.rating_num::text').get() # 提取电影评分
item['link'] = movie.css('a::attr(href)').get() # 提取电影链接
yield item # 返回Item以供后续处理
next_page = response.css('.next a::attr(href)').get() # 提取下一页的链接
if next_page is not None:
yield response.follow(next_page, self.parse) # 继续爬取下一页
在这个Spider中,指定了Spider的名称(name)、允许的域名(allowed_domains)、起始URL(start_urls)以及如何解析响应的方法(parse)。使用CSS选择器来提取排名、标题、评分和链接等信息,并将它们保存到一个自定义的Item类中。
创建Item类
在Scrapy中,Item是用来定义要提取的数据结构的类。在的项目中,创建了一个DoubanTop250Item类,用于定义电影信息的数据结构。以下是Item类的代码:
import scrapy
class DoubanTop250Item(scrapy.Item):
rank = scrapy.Field()
title = scrapy.Field()
rating = scrapy.Field()
link = scrapy.Field()
在这个类中,定义了四个字段:排名(rank)、标题(title)、评分(rating)和链接(link)。这些字段将用于存储从网页上提取的数据。
配置数据存储
Scrapy允许您配置不同的数据存储选项,包括JSON、CSV、XML等格式。我选择将数据保存为JSON文件。
在项目的设置中,配置了FEEDS设置,以指定JSON文件的保存位置和格式:
FEEDS = {
'douban_top250.json': {
'format': 'json',
'encoding': 'utf-8',
},
}
这将数据以JSON格式保存到名为douban_top250.json的文件中。
运行Scrapy爬虫
一旦编写好Spider和Item类,并配置好数据存储选项,就可以运行Scrapy爬虫来抓取豆瓣Top 250电影数据了。运行以下命令:
scrapy crawl douban_movie
Scrapy将开始访问豆瓣电影网站的页面,抓取数据并保存为JSON文件。
拿到的数据如图:
处理常见问题
在爬取网站数据时,可能会遇到各种常见问题,如请求限制、页面解析问题和网络连接问题。以下是一些处理这些问题的一般指导:
-
请求限制:如果您遇到HTTP状态码403(禁止访问)或其他请求限制问题,可以尝试设置合适的User-Agent、使用IP代理、限制请求速度以及尊重网站的robots.txt规则。
本次遇到的问题:
DEBUG: Crawled (403) <GET https://movie.douban.com/top250> (referer: None)
解决方案: User-Agent设置:尝试在Scrapy中设置一个常见的浏览器User-Agent,以使请求看起来更像是由浏览器发出的。这可以通过在Spider中添加
USER_AGENT
设置来完成,如下:USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36'
-
页面解析问题:在编写Spider时,确保您的选择器和规则正确。经常检查网站的HTML结构,以适应可能的更改。
-
网络连接问题:网络连接问题可能会导致请求超时或失败。确保您
的网络连接稳定,使用合理的超时设置,以及适当处理连接异常。
结论
使用Scrapy爬取豆瓣Top 250电影数据是一个很好的示例,展示了如何创建一个功能强大的网络爬虫,用于从网站上抓取数据。在本文中,涵盖了创建Scrapy项目、编写Spider、数据提取、保存为JSON文件以及处理常见问题的方方面面。Scrapy为爬虫开发者提供了强大的工具,使得数据抓取变得更容易。
题外话
感谢你能看到最后,给大家准备了一些福利!
感兴趣的小伙伴,赠送全套Python学习资料,包含面试题、简历资料等具体看下方。
👉CSDN大礼包🎁:全网最全《Python学习资料》免费赠送🆓!(安全链接,放心点击)
一、Python所有方向的学习路线
Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照下面的知识点去找对应的学习资源,保证自己学得较为全面。
二、Python兼职渠道推荐*
学的同时助你创收,每天花1-2小时兼职,轻松稿定生活费.
三、最新Python学习笔记
当我学到一定基础,有自己的理解能力的时候,会去阅读一些前辈整理的书籍或者手写的笔记资料,这些笔记详细记载了他们对一些技术点的理解,这些理解是比较独到,可以学到不一样的思路。
四、实战案例
纸上得来终觉浅,要学会跟着视频一起敲,要动手实操,才能将自己的所学运用到实际当中去,这时候可以搞点实战案例来学习。
👉 CSDN大礼包:gift::[全网最全《Python学习资料》免费赠送:free:!](https://blog.csdn.net/weixin_68789096/article/details/132275547?spm=1001.2014.3001.5502) (安全链接,放心点击)若有侵权,请联系删除