scrapy分页抓取网页(【】本次项目利用scrapy爬虫框架实现框架 )

优采云 发布时间: 2021-10-04 09:06

  scrapy分页抓取网页(【】本次项目利用scrapy爬虫框架实现框架

)

  ​

  1、项目介绍

  本项目使用scrapy爬虫框架抓取豆瓣top250的详情页信息。主要字段如下:

  

  主要领域:

  Num——》电影排行榜

  DetailLink——》详情页链接

  片名——》片名

  RatingNum——"评级

  票数——》评价数

  导演——》导演

  编剧——》编剧

  演员——》主演

  类型——“类型

  发布日期——》发布时间

  运行时间——》长度

  2、创建项目文件

  创建一个scrapy项目

  crapy startproject douban

  创建爬虫源文件

  scrapy genspider douban250 www.douban.com

  3、爬虫文件配置3.1配置设置文件

  1)防爬配置

  # 关闭 robots

ROBOTSTXT_OBEY = False

# 配置请求头

```python

USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.107 Safari/537.36'

# 为方便调试 修改日志等级为‘ERROR’

LOG_LEVEL = 'ERROR'

  2)打开管道

  ITEM_PIPELINES = {

'douban.pipelines.DoubanPipeline': 300,

}

  3.2 配置项目文件

  定义要爬取的字段

  class DoubanItem(scrapy.Item):

# define the fields for your item here like:

# name = scrapy.Field()

Num = scrapy.Field()

DetailLink = scrapy.Field()

Title = scrapy.Field()

RatingNum = scrapy.Field()

Votes = scrapy.Field()

Director = scrapy.Field()

Writer = scrapy.Field()

Actor = scrapy.Field()

Type = scrapy.Field()

ReleaseDate = scrapy.Field()

RunTime = scrapy.Field()

  4、爬虫文件写入4.1、字段空值处理

  在爬取字段的过程中,部分电影详情页没有对应的字段信息。程序运行到这里会报错,影响爬虫的运行。其次,为了存储信息结构的完整性,应该从这个记录中给出这个字段。空值占用。为了处理上述问题,可以编写一个处理字段空值的函数如下:

   def try_except(self, response, xpath_str):

try:

field = response.xpath(xpath_str).extract_first()

except:

field = ''

return field

  4.2、 目录页面分析函数编写

   def parse(self, response):

li_list = response.xpath('//*[@id="content"]/div/div[1]/ol/li')

for li in li_list:

item = DoubanItem()

# 解析每个字段时调用4.1定义的空值处理函数,传入网页相应和xpath表达式

item['Num'] = self.try_except(li, './/em/text()')

item['DetailLink'] = self.try_except(li, './/a[1]/@href')

# 提交详情页链接,经过调度,执行生成scrapy.http.Response 对象并送回给详情页解析方法

yield scrapy.Request(item['DetailLink'],

callback=self.parse_detail_html,

meta={'item': deepcopy(item)})

  4.2、 翻页代码编写

  抓取下一页的链接并完成链接,将下一页的响应对象交给目录页面分析方法

<p>next_url = &#39;https://movie.douban.com/top250&#39; + self.try_except(response, &#39;//*[@id="content"]/div/div[1]/div[2]/span[3]/a/@href&#39;)

print(f&#39;已完成:{self.i}页&#39;)

self.i += 1

if self.i

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线