循环翻页爬虫_Scrapy爬虫框架入门

2ce10fe8ab13a7422d8bc5c1e7fc5525.png

一、环境

  • windows 8.1
  • python3.6.4
  • scrapy1.5.1
  • 明白Python的基本语法系列

二、知识点

  • xpath
  • 文字内容爬取并存本地文件
  • 翻页爬取
  • 图片爬取并存本地
  • 简单的反爬虫
  • 数据存数据库(mysql)
  • 日志
  • 网站地址:https://movie.douban.com/top250

三、项目构建及文件说明

1、项目创建

scrapy startproject Douban

2、项目初始化

cd Doubanscrapy genspider douban "douban.com"

3、各文件说明

414c31e2e76a348e78e8b53b968177a6.png

四、xpath解析说明

以Chrome插件(XPath Helper)为例。

//ol[@class='grid_view']/li/div[@class='item']

即可解析出所有的电影信息模块,然后循环遍历进行处理即可。

PS:“//” 即代表从任意路径下开始寻找

五、字段设置

即 item.py 文件。

# 电影名字film_name = scrapy.Field()# 导演和主演名字director_performer_name = scrapy.Field()# 主演名字# performer_name = scrapy.Field()# 电影上映年份film_year = scrapy.Field()# 电影国家film_country = scrapy.Field()# 电影类型film_type = scrapy.Field()# 电影评分film_rating = scrapy.Field()# 电影评论人数film_reviews_num = scrapy.Field()# 电影经典语句film_quato = scrapy.Field()# 电影图片film_img_url = scrapy.Field()

六、爬虫编写

即 douban.py 文件。

以下代码,注释很详细,细节暂不赘述,简单提一下 yield 的用法:

yield 是个很重要的语法,有着 return 的部分功能,但完全不同于 return。

return 会返回信息并且终止当前的方法,而 yield 虽然也会返回一个信息给调用者,但是调用者使用完了之后程序还会回到此处继续执行。

比如用在此爬虫的 for 循环中的妙处是:此处生成 item 之后返回给调度器进行相关的处理,然后程序再回到这里继续运行,即继续下一个循环,然后再生成一个新的 item 提供给调度器,如此往复,直到循环结束。

# 爬虫名称(必须唯一)name = 'douban'# 非此域名下的链接均不进行爬取allowed_domains = ['douban.com']base_url = 'https://movie.douban.com/top250'off_set = '?start=0&filter='# 起始的爬取地址start_urls = [base_url + off_set]# 每次的爬取都会默认走这个 parse 方法def parse(self, response): # xpath 解析出每个电影的信息模块 films = response.xpath("//ol[@class='grid_view']/li/div[@class='item']") # 遍历每个电影模块 for film in films: # 创建电影信息存储的item对象 item = DoubanItem() # 标题 titles = film.xpath("./div[@class='info']/div[@class='hd']/a/span/text()").extract() film_name = '' # 拼接电影名 for title in titles: film_name += title.strip() # 电影信息 infos = film.xpath("./div[@class='info']/div[@class='bd']/p/text()").extract() director_performer_name = "" for temp in infos[0]: director_performer_name += temp.strip() year_country = infos[1] film_year = year_country.split("/")[0].strip() film_country = year_country.split("/")[1].strip() film_type = year_country.split("/")[2].strip() # 电影评分 film_rating = film.xpath("./div[@class='info']/div[@class='bd']/div[@class='star']/span[@class='rating_num']/text()").extract()[0].strip() # 电影参与评论人数 film_reviews_num = film.xpath("./div[@class='info']/div[@class='bd']/div[@class='star']/span[last()]/text()").extract()[0].strip()[:-3] # 电影经典语句 film_quato = "" film_quato_temp = film.xpath("./div[@class='info']/div[@class='bd']/p[@class='quote']/span/text()").extract() if film_quato_temp: film_quato = film_quato_temp[0].strip() # 电影图片链接 film_img_url = film.xpath("./div[@class='pic']/a/img/@src").extract()[0].strip() # item 字段赋值 item['film_name'] = film_name item['director_performer_name'] = director_performer_name # item['director_name'] = director_name # item['performer_name'] = performer_name item['film_year'] = film_year item['film_country'] = film_country item['film_type'] = film_type item['film_rating'] = film_rating item['film_reviews_num'] = film_reviews_num item['film_quato'] = film_quato item['film_img_url'] = film_img_url # 返回 item 进行解析,解析完了之后再回到这里继续运行 yield item # 翻页 # 解析出下一页 next_url = response.xpath("//div[@class='paginator']/span[@class='next']/a/@href").extract() if next_url: # 如果下一页存在的话再进行请求,并传递回调函数 parse() yield scrapy.Request(self.base_url + next_url[0], self.parse)

七、“管道”说明

即 pipelines.py 文件。

说明:正如其名“管道”,它是用来处理 item 的,所以,我们可以写多个“管道”文件来处理 item,但是要注意:

① 每个“管道”处理完之后记得 return item,否则后续管道无法再进行处理,毕竟拿不到了嘛;

② 管道是有执行顺序的,所以需要我们进行定义其顺序(settings.py 文件),数字小,先执行:

 # Configure item pipelines  # See https://doc.scrapy.org/en/latest/topics/item-pipeline.html ITEM_PIPELINES = { 'Douban.pipelines.DoubanMoviePipeline': 300, 'Douban.pipelines.DoubanImgPipeline': 301, 'Douban.pipelines.DoubanDBPipeline': 400 }

1、文本内容存本地文件

即配置里面的:'Douban.pipelines.DoubanMoviePipeline': 300,

也是比较简单,看下文代码的注释即可,但是要注意编码。

class DoubanMoviePipeline(object): """ 处理电影信息 """ def __init__(self): # 初始化:文件打开 self.f = codecs.open("doubanData.json
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值