300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > Python3编写网络爬虫04-爬取猫眼电影排行实例

Python3编写网络爬虫04-爬取猫眼电影排行实例

时间:2022-12-19 05:39:11

相关推荐

Python3编写网络爬虫04-爬取猫眼电影排行实例

利用requests库和正则表达式 抓取猫眼电影TOP100 (requests比urllib使用更方便,由于没有学习HTML系统解析库 选用re)

1.目标 抓取电影名称 时间 评分 图片等

url /board/4 结果以文件形式保存

2.分析

offset 代表偏移量 如果为n 电影序号为n+1~n+10 每页显示10个

获取100 分开请求10次 offset 分别为0 10 20...90 利用正则提取相关信息

3.抓取页面

import requests#爬取第一页 页面信息def get_one_page(url):header = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",}response = requests.get(url,headers=header)if response.status_code == 200:#判断是否请求成功return response.textreturn None

# 定义一个main函数 调用get_one_page 发送请求 打印结果

def main():url = '/board/4'html = get_one_page(url)#调用请求函数print(html)main()

分析页面

电影信息对应节点为<dd>

提取排名 class 为 board-index i节点内 正则 <dd>.*?board-index.*?>(.*?)</i>

电影图片 查看为第二个img链接 <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)"

电影名字 p节点 class 为name <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>

主演 <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>

发布时间 <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>

评分 <dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>

定义分析页面的方法 parse_one_page()

import requestsimport redef get_one_page(url):header = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",}response = requests.get(url,headers=header)if response.status_code == 200:return response.textreturn Nonedef parse_one_page(html):pattern = pile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)items = re.findall(pattern,html)print(items)# 定义一个main函数 调用get_one_page 发送请求 打印结果def main():url = '/board/4'html = get_one_page(url)# print(html)parse_one_page(html)main()

将匹配结果遍历 生成字典

import requestsimport redef get_one_page(url):header = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",}response = requests.get(url,headers=header)if response.status_code == 200:return response.textreturn Nonedef parse_one_page(html):# html为网页源码pattern = pile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)#定义规则items = re.findall(pattern,html)#查找整个页面# print(items)#遍历结果生成字典for item in items:yield {'index':item[0],'image': item[1],'title': item[2].strip(),'actor': item[3].strip()[3:] if len(item[3]) > 3 else'','time': item[4].strip()[5:] if len(item[4]) > 5 else '','score': item[5].strip()+item[6].strip()}#返回一个生成器 yield# 定义一个main函数 调用get_one_page 发送请求 打印结果def main():url = '/board/4'html = get_one_page(url)# print(html)for item in parse_one_page(html):#遍历生成器print(item)main()写入文件将提取结果 写入文件 通过json库 的dumps() 实现字典的序列化 指定ensure_ascii 参数为 False #写入文件def write_to_file(content):with open('result.txt','a',encoding='utf-8') as f:print(type(json.dumps(content)))f.write(json.dumps(content,ensure_ascii=False)+'\n')

整合代码 单页面电影提取

import requestsimport reimport json# 请求页面def get_one_page(url):header = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",}response = requests.get(url,headers=header)if response.status_code == 200:return response.textreturn None#解析页面def parse_one_page(html):# html为网页源码pattern = pile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)#定义规则items = re.findall(pattern,html)#查找整个页面# print(items)#遍历结果生成字典for item in items:yield {'index':item[0],'image': item[1],'title': item[2].strip(),'actor': item[3].strip()[3:] if len(item[3]) > 3 else'','time': item[4].strip()[5:] if len(item[4]) > 5 else '','score': item[5].strip()+item[6].strip()}#返回一个生成器 yield#写入文件def write_to_file(content):with open('result.txt','a',encoding='utf-8') as f:print(type(json.dumps(content)))f.write(json.dumps(content,ensure_ascii=False)+'\n')# 定义一个main函数 调用get_one_page 发送请求 打印结果def main():url = '/board/4'html = get_one_page(url)# print(html)for item in parse_one_page(html):#遍历生成器write_to_file(item)main()

分页爬取

# 定义一个main函数 调用get_one_page 发送请求 打印结果

def main(offset):url = '/board/4?offset=' + str(offset)html = get_one_page(url)# print(html)for item in parse_one_page(html):#遍历生成器write_to_file(item)if __name__ == '__main__':for i in range(10):main(offset = i *10)

整理代码

#-*-coding:utf-8-*-import requests #请求库import re #正则模块import json #json模块import time #时间模块from requests.exceptions import RequestException#捕获异常模块# 请求页面def get_one_page(url):#异常处理try:header = {"User-Agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1; en-US) AppleWebKit/534.16 (KHTML, like Gecko) Chrome/10.0.648.133 Safari/534.16",}response = requests.get(url,headers=header)# 判断状态码是否为200if response.status_code == 200:return response.textreturn Noneexcept RequestException:return None#解析页面def parse_one_page(html):# html为网页源码#定义爬取规则pattern = pile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name.*?a.*?>(.*?)</a>.*?star.*?>(.*?)</p>.*?releasetime.*?>(.*?)</p>.*?integer.*?>(.*?)</i>.*?fraction.*?>(.*?)</i>.*?</dd>',re.S)# 查找整个页面items = re.findall(pattern,html)# print(items)#遍历结果生成字典for item in items:yield {'index':item[0],'image': item[1],'title': item[2].strip(),'actor': item[3].strip()[3:] if len(item[3]) > 3 else'','time': item[4].strip()[5:] if len(item[4]) > 5 else '','score': item[5].strip()+item[6].strip()}#返回一个生成器 yield#写入文件def write_to_file(content):with open('result.txt','a',encoding='utf-8') as f:# print(type(json.dumps(content)))# ensure_ascii=False 保证输出结果为中文f.write(json.dumps(content,ensure_ascii=False)+'\n')# 定义一个main函数 调用get_one_page 发送请求 参数offset 网页偏移量def main(offset):#拼接url地址url = '/board/4?offset=' + str(offset)# 请求函数html = get_one_page(url)# print(html)# 解析函数 和 文件保存函数for item in parse_one_page(html):#遍历生成器write_to_file(item)if __name__ == '__main__':for i in range(10):main(offset = i *10)#延时处理time.sleep(3)

# 最基础的实例 做好总结

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。