requests+re-爬取豆瓣电影top250,看看都有哪些电影上榜

简介: 这是一个很简单的获取豆瓣网文本内容的爬虫,涉及到requests模块get方法的使用,正则表达式re模块的对数据进行抽取,得到我们关注的内容(电影名,影片上映时间,评分,评论人数),最后保存到csv文件中

前期准备

python模块: re模块,requests模块,csv模块
豆瓣电影top250地址:https://movie.douban.com/top250

请求数据

1、使用requests模块的get()方法获取网页源码。

# 请求头
import requests
headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
         }
#resp接收get请求响应的数据
resp=requests.get("https://movie.douban.com/top250",headers=headers)

#text查看响应的内容
print(resp.text)
resp.close()

使用requests获取的网页源码(开头)
代码回获取的网页源码
网页开发者模式看到的源码(开头)
在这里插入图片描述
注意:

  • 为什么get()需要headers参数:模拟网站的正常访问,绕开反爬机制

  • headers如何找到:F12,开发者工具。requests下

  • 在这里插入图片描述

  • resp.close():关闭你的请求,如果你不关掉你的请求,时间长了或者多次执行代码后就会限制访问这个网页(亲测)

数据处理

2、使用正则表达式,对筛选我们需要的内容

#预加载
import requests
import re
headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
         }
reStr=re.compile(
                r'<li>.*?<em class="">(?P<topnum>.*?)</em>.*?' # top榜排名
                 r'<span class="title">(?P<name>.*?)</span>.*?' # 电影名
                 r'.*?<br>(?P<year>.*?)&nbsp' # 上映年份
                 r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<nums>.*?)人评价</span>' # 评论人数

                 ,re.S)
resp=requests.get("https://movie.douban.com/top250",headers=headers)
obj=resp.text
res = reStr.finditer(obj) # finditer匹配整个语句,并返回一个迭代器
for i in res:
    print(i.group('topnum')) # 打印我们需要的分组
    print(i.group('name'))
    print(i.group('year').strip()) # strip处理空格
    print(i.group('score'))
    print(i.group('nums'))
resp.close()

运行截图(我们获取了一个页面的内容,共25条数据):
在这里插入图片描述
完整的250条数据:
通过分析网址发现仅start的参数有变化:
(第一页)https://movie.douban.com/top250?start=&filter=
(第二页)https://movie.douban.com/top250?start=25&filter=
所以我们通过循环遍历的方式,去改变url,达到获取整个top榜的数据

import requests
import re
headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
         }
reStr=re.compile(
                r'<li>.*?<em class="">(?P<topnum>.*?)</em>.*?' # top榜排名
                 r'<span class="title">(?P<name>.*?)</span>.*?' # 电影名
                 r'.*?<br>(?P<year>.*?)&nbsp' # 上映年份
                 r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<nums>.*?)人评价</span>' # 评论人数

                 ,re.S)
 # 新增的for循环遍历改变网址
for it in range(0,250,25):
    url = "https://movie.douban.com/top250?start={}".format(it)
    # 未改变
    resp=requests.get(url,headers=headers)
    obj=resp.text
    res = reStr.finditer(obj) # finditer匹配整个语句,并返回一个迭代器
    for i in res:
        print(i.group('topnum'),end=" ")
        print(i.group('name'),end=" ")
        print(i.group('year').strip(),end=" ")
        print(i.group('score'),end=" ")
        print(i.group('nums'))
resp.close()


运行截图(部分)
在这里插入图片描述

保存数据

3、把内容保存到csv文件中

import csv

# 新建文件,不使用encoding,windows用户保存的文件容易出现乱码的情况
f=open("topdata.csv",mode="w",encoding="utf-8")
csvwriter=csv.writer(f)

for it in range(0,250,25):
    url = "https://movie.douban.com/top250?start={}".format(it)
    resp=requests.get(url,headers=headers)
    obj=resp.text
    res = reStr.finditer(obj) # finditer匹配整个语句,并返回一个迭代器F
    for i in res:
        # print(i.group('topnum'),end=" ")
        # print(i.group('name'),end=" ")
        # print(i.group('year').strip(),end=" ")
        # print(i.group('score'),end=" ")
        # print(i.group('nums'))
        #遍历写入数据
        dict = i.groupdict()
        dict['year'] = dict['year'].strip()
        csvwriter.writerow(dict.values())

成功保存截图:
在这里插入图片描述
完整代码:

import requests
import re
import csv
headers={
    "User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/96.0.4664.45 Safari/537.36"
         }
reStr=re.compile(
                r'<li>.*?<em class="">(?P<topnum>.*?)</em>.*?' # top榜排名
                 r'<span class="title">(?P<name>.*?)</span>.*?' # 电影名
                 r'.*?<br>(?P<year>.*?)&nbsp' # 上映年份
                 r'.*?<span class="rating_num" property="v:average">(?P<score>.*?)</span>.*?<span>(?P<nums>.*?)人评价</span>' # 评论人数

                 ,re.S)
# 新建文件,不使用encoding,windows用户保存的文件容易出现乱码的情况
f=open("topdata.csv",mode="w",encoding="utf-8")
csvwriter=csv.writer(f)



for it in range(0,250,25):
    url = "https://movie.douban.com/top250?start={}".format(it)
    resp=requests.get(url,headers=headers)
    obj=resp.text
    res = reStr.finditer(obj) # finditer匹配整个语句,并返回一个迭代器F
    for i in res:
        # print(i.group('topnum'),end=" ")
        # print(i.group('name'),end=" ")
        # print(i.group('year').strip(),end=" ")
        # print(i.group('score'),end=" ")
        # print(i.group('nums'))
        #遍历写入数据
        dict = i.groupdict()
        dict['year'] = dict['year'].strip()
        csvwriter.writerow(dict.values())
resp.close()
# 操作完文件后就关闭,养成好习惯
f.close()
print("over")


这就是一个完整的简单的爬虫实例,可以去试一试了!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值