正则解析豆瓣TOP250

正则解析豆瓣TOP250

前言

  • 学习了一段时间爬虫了,越到后期越觉得基础的重要,基础知识运用的快不快,灵不灵活,很大程度上决定了项目开发的速度.因此鄙人将开一个小栏分享我与爬虫的那些事儿.
  • 对于爬虫而言,前期学习是相对简单的,有利于鼓励同学提升自己的信心,而后期的学习则比较艰难.在涉及到数据库,js逆向,app逆向等进阶层次的时候,所需要的知识面会非常广.
  • 今天我们就来看一个小项目,爬取豆瓣 TOP250的数据,主要是为了加深对re模块的理解与使用.
  • 开冲!
    gogogo!

需求

在这里插入图片描述

  • ⽬标: 抓取"电影名称",“上映年份”,“评分”,"评分⼈数"四项内容.

页面分析

  • 首先简要解释一下,服务端与客户端之间的交互.
  • 两者之间的交互遵循HTTP/s协议.客户端向服务端发请求,服务端返回请求数据
  • 以前很多的网站会直接返回带数据的html,但是现在越来越多的网站会将html与数据分离,提高了对爬虫开发者的考验.
  • 需要注意的是,再谷歌开发者工具中,源码与elements中的代码是有区别的,前者是没有经过渲染的,也就是我们请求到的数据,而elements中的数据是经过渲染的,我们只能以elements做参考,基准还是页面源码.

所以接下来我们就看看,页面源码是否有数据
在这里插入图片描述
很明显, 我们想要的数据全部都在⻚⾯源代码中体现了. 接下来我们可以编写代码了.

源码

import requests
# 添加最基本的UA伪装
headers = { "user-agent": "Mozilla/5.0 (Macintosh; IntelMac OS X 10_15_4) AppleWebKit/537.36 (KHTML, likeGecko) Chrome/87.0.4280.88 Safari/537.36"}
url = "https://movie.douban.com/top250?start=0&filter="
resp = requests.get(url, headers=headers)

print(resp.text)
  • 随后我们可以通过分析打印出来的数据来编写相应的正则表达式,匹配我们需要的字符串,完成提取.
obj = re.compile(r'<li>.*?<div class="item">.*?<divclass="pic">.*?<em class="">(?P<num>\d+)</em>' r'.*?<span class="title">(?P<name>.*?)</span>' r'.*?<p class="">.*?<br>\n(?P<year>.*?)&nbsp;' r'.*?property="v:average">(?P<average>.*?)</span>' r'.*?<span>(?P<people>\d+)⼈评价</span>', re.S)

看到这一串正则表达式,难免让人头大.

  • 正则解析是爬虫中解析数据最快的方式,但是对于新手而言极不友好.不过再爬虫中,我们最需要掌握的正则知识,不是全部,再解析数据的时候,也有一定的套路.
  • 比如再这个项目中,我们需要爬取的是每一个电影的信息,页面的排版绝大部分情况下是规则的,我们需要找到每一个电影的信息的最大集合,然后把源码复制下来,把需要提取的数据进行分组(?P),然后进行迭代提取
  • 上述正则表达式中,re,S的作用是使得.能匹配换行符(本来不行)
  • 随后,开始匹配, 将最终完整的数据按照⾃⼰喜欢(需要)的⽅式写⼊⽂件.
it = obj.finditer(resp.text)
with open("movie.csv", mode="w", encoding="utf-8") as f: 
csvwriter = csv.writer(f) # 创建csv⽂件写⼊⼯具,也可以直接f.write() 
for item in it: 
dic = item.groupdict() dic['year'] = dic['year'].strip() csvwriter.writerow(dic.values()) # 写⼊数据
  • 当然代码还有优化空间,可以思考⼀下如何进⼀步对代码优化(时间复杂度, 空间复杂度), 各位可以⾃⾏想办法将⾖瓣TOP250条数据全部抓取到.
  • 不过大家不要对豆瓣撸太多次,要对爬虫持有敬畏,仅供学习使用,豆瓣快被人撸坏了
  • 在这里插入图片描述
  • 4
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

popcorn_min

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值