scrapy批量爬取豆瓣电影排行信息
- 1.创建项目
- 2.编写items
- 3.douban.py
- 4.pipelines.py
- 5.爬取得到的文件
scrapy的使用及其安装请看这里
使用scrapy框架批量爬取豆瓣电影排行信息,首先看到豆瓣电影链接为
https://movie.douban.com/top250
经过分析,一共10页,第二页,第二页,…,第10页的规律是:
分页规律 第N页
https://movie.douban.com/top250?start=25*(N-1)
分析完毕后,下一步开始创建项目
1.创建项目
# 创建一个名为 douban_mv 的 Scrapy 项目
# 在控制台输入命令如下
scrapy startproject douban_mv
然后进入到spiders目录下
cd douban_mv/douban_mv/spiders
在控制台输入命令
scrapy genspider douban https://movie.douban.com/top250
在进行爬取豆瓣电影排行信息之前需要主要两点
- scrapy是遵守robots协议的,如果robots协议禁止爬取的内容,scrapy会默认不去爬取,所以可以把ROBOTSTXT_OBEY=True改为ROBOTSTXT_OBEY=False或者直接注释,这样就无需遵守robots协议,Scrapy就可以不受限制运行。
在settings.py中设置
# Obey robots.txt rules
#ROBOTSTXT_OBEY = True
- 在settings.py中设置USER_AGENT
USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36"
2.编写items
items主要是定义实体类,实体类中定义我们需要的信息
class DoubanMvItem(scrapy.Item):# define the fields for your item here like:title = scrapy.Field() # 电影名称ratingNum = scrapy.Field() # 电影评分commentCount = scrapy.Field() # 评价人数
3.douban.py
在douban.py中进行编写主要的逻辑
class DoubanSpider(scrapy.Spider):name = "douban"allowed_domains = ["movie.douban.com"]start_urls = ["https://movie.douban.com/top250"]base_url = 'https://movie.douban.com/top250'page = 1def parse(self, response):print("--------------------")# name = //div[@class="article"]//li//div[@class="hd"]//a/span[1]/text()# ratingNum = //div[@class="article"]//li//div[@class="bd"]/div[@class="star"]/span[2]/text()#commentNum = //div[@class="article"]//li//div[@class="bd"]/div[@class="star"]/span[4]/text()li_list = response.xpath('//div[@class="article"]//li')for li in li_list:title = li.xpath('.//div[@class="hd"]//a/span[1]/text()').extract_first()ratingNum = li.xpath('.//div[@class="bd"]/div[@class="star"]/span[2]/text()').extract_first()commentCount = li.xpath('.//div[@class="bd"]/div[@class="star"]/span[4]/text()').extract_first()mv = DoubanMvItem(title=title, ratingNum=ratingNum, commentCount=commentCount)# 获取一个mv 交给pipeline管道yield mvif self.page<=2:self.page = self.page +1url = self.base_url+'?start='+str(self.page*25)# scrapy.Request就是scrapy就是get请求# url就是请求地址 callback就是回调,也就是要执行的函数 再次调用parse函数yield scrapy.Request(url=url,callback=self.parse)
4.pipelines.py
在使用前需要在settings.py中,打开管道爬取
ITEM_PIPELINES = {"douban_mv.pipelines.DoubanMvPipeline": 300,
}
编写管道文件,将爬取下来的数据下载到表格中
class DoubanMvPipeline:# item就是yield后面的mv对象df = pd.DataFrame()def open_spider(self, spider):print('-----open-----')def process_item(self, item, spider):# 返回 item 对象,交给下一个管道处理series = pd.Series(item)self.df = self.df.append(series,ignore_index=True)return itemdef close_spider(self, spider):print('-----close-----')self.df.to_excel("mv_top250.xlsx")
5.爬取得到的文件
爬取得到的文件如下