ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2021-11-25 15:59:34  阅读:216  来源: 互联网

标签:group headers resp 电影 爬取 re print requests


简介: 这是一个很简单的获取豆瓣网文本内容的爬虫,涉及到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")


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

标签:group,headers,resp,电影,爬取,re,print,requests
来源: https://blog.csdn.net/qq_53270893/article/details/121537157

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有