爬虫--3.2 实战案例:猫眼电影---使用requests爬虫库爬取猫眼电影中榜单栏⽬中TOP100榜的所有电影信息,并将信息 写⼊⽂件

本文介绍了一种使用Python爬虫技术抓取猫眼电影排行榜单的方法,通过发送GET请求获取网页内容,利用正则表达式解析数据,并将电影信息保存到本地文件中。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

先爬取第一页的榜单电影

import requests
import time,json,re

url = "https://maoyan.com/board/4"
headers = {
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'
}
res = requests.get(url,headers=headers)
# print(res.text)
pat ='<i class="board-index board-index-[0-9]+">([0-9])</i>.*?<img data-src="(.*?)" alt="(.*?)" class="board-img" />.*?<p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>.*?<p class="score"><i class="integer">([0-9.]+)</i><i class="fraction">([0-9.])</i></p> '
# pat = '<i class="board-index board-index-[0-9]+">([0-9])</i>.*?<img data-src="(.*?)" alt="(.*?)" class="board-img" />.*? <p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>.*?<p class="score"><i class="integer">([0-9.]+)</i><i class="fraction">([0-9])</i></p>'

html = res.content.decode('utf-8')
# print(html)
items = re.findall(pat,html,re.S) #我没加re.S,是返回一个空值
print(items)
# for item in items():
#     print(item)

封装函数,完整版代码

'''
使用requests爬虫库爬取猫眼电影中榜单栏⽬中TOP100榜的所有电影信息,并将信息
写⼊⽂件

⽬标:使⽤urllib分⻚爬取猫眼电影中榜单栏⽬中TOP100榜的所有电影信息,并将信息写⼊⽂件
URL地址:https://maoyan.com/board 其中参数offset表示其实条数
获取信息:{排名,图⽚,标题,主演,放映时间,评分}

分析:
URL地址: 第一页:https://maoyan.com/board/4?offset=0
          第二页:https://maoyan.com/board/4?offset=10
          第三页:https://maoyan.com/board/4?offset=20
          第四页:https://maoyan.com/board/4?offset=30
请求方式:GET   ---------找到Network,刷新一下之后,找到描述网址的那个页面,查看General -> Request Method
参数:offset: 0~90
返回信息:HTML代码
'''
import requests
import time,json,re
from requests.exceptions import RequestException

# 抓取网页内容
def getPages(url):
    try:
            # 封装请求头信息
        headers = {
                'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36'
                 }

        res = requests.get(url,headers = headers)
        print(res.status_code)
        if res.status_code == 200:
            #1.一种写法:
            res.encoding = 'utf-8'
            # print(res.text)
            return res.text
        else:
            return None
    except RequestException:
        return None

#解析抓取的内容
def paresPages(html):
    # 使用正则进行解析
    pat = '<i class="board-index board-index-[0-9]+">([0-9]+)</i>.*?<img data-src="(.*?)" alt="(.*?)" class="board-img" />.*? <p class="star">(.*?)</p>.*?<p class="releasetime">(.*?)</p>.*?<p class="score"><i class="integer">([0-9.]+)</i><i class="fraction">([0-9])</i></p>'
    items = re.findall(pat,html,re.S)
# 如果不使用re.S参数,则只在每一行内进行匹配,如果一行没有,就换下一行重新开始。
# 而使用re.S参数以后,正则表达式会将这个字符串作为一个整体,在整体中进行匹配。
    for item in items:
        yield {
            'index':item[0],
            'image':item[1],
            'title':item[2],
            'actor':item[3].strip()[3:],
            'time':item[4].strip()[5:],
            'score':item[5]+item[6],
            }
        # print(item)
# 存储内容
def writeFile(content):
    with open("./esult.txt",'a',encoding='utf-8') as f:
        f.write(json.dumps(content,ensure_ascii=False) + "\n")

#主函数调用
def main(offset):
    url = 'https://maoyan.com/board/4?offset='+str(offset)
    html = getPages(url)
    if html:
        # writeFile(item)
        for item in paresPages(html):
            writeFile(item)

# 判断当前执⾏是否为主程序运⾏,并遍历调⽤主函数爬取数据
if __name__ == '__main__':
    for i in range(10):
        main(offset=i*10)
        time.sleep(1)

其实这里还有一个问题是,这个文件esult.txt,跑代码的时候并没有被创建进当前文件夹,所以我是手动创建的,然后代码写入

如果出不了结果,刷新猫眼电影的网页,然后看看是否是登录,这个必须要登录状态才能爬取,且时不时要刷新

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值