爬虫入门到精通_实战篇7(Requests+正则表达式爬取猫眼电影)_ 抓取单页内容,正则表达式分析,保存至文件,开启循环及多线程

1 目标

猫眼榜单TOP100:https://www.maoyan.com/board
在这里插入图片描述

2 流程框架

  1. 抓取单页内容:利用requests请求目标站点,得到单个网页HTML代码,返回结果。
  2. 正则表达式分析:根据HTML代码分析得到电影名称,主演,上映时间,评分,图片链接等信息。
  3. 保存至文件:通过文件的形式将结果保存,每一步电影一个结果一行json字符串。
  4. 开启循环及多线程:对多页内容遍历,开启多线程提高抓取速度。

3 实战

1.抓取单页内容

import requests
from requests.exceptions import RequestException# 提取单页内容,用try,except防止挂机
def get_one_page(url):try:response = requests.get(url)if response.status_code == 200:#如果状态码为200,请求成功return  response.textreturn response.status_code  #请求失败,返回状态码结果except RequestException:return  Nonedef main():url = "https://www.maoyan.com/board/4"html = get_one_page(url)print(html)
if __name__ == '__main__':main()

url路径:下图可知:第一页offset = 0,第二页offset=10
在这里插入图片描述

respnse查看内容:Network 选项->筛选Doc
在这里插入图片描述
返回:
在这里插入图片描述
如果报了403状态码:
请求是加上headers

headers = {'User-Agent':'Mozilla/5.0(Macintosh;Intel Mac OS X 10_11_4)AppleWebKit/537.36(KHTML,like Gecko)Chrome/52.0.2743.116 Safari/537.36'}
#提取单页内容,用try,except方便找bug
def get_one_page(url):try:response = requests.get(url, headers=headers)#传入headers参数if response.status_code == 200:return response.textreturn response.status_codeexcept RequestException:return None

2 正则表达式分析

根据HTML代码分析得到电影名称,主演,上映时间,评分,图片链接等信息。
HTML的结构:
在这里插入图片描述
红色箭头是需要提取的信息,正则表达式如下:

def parse_one_page(html):# 生成一个正则表达式对象pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'  # 此处换行+ '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'+ '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)items = re.findall(pattern,html)# items是一个list,提取信息成字典形式for item in items:yield { # 构造一个字典'index': item[0],'image':item[1],'title':item[2],'actor':item[3].strip()[3:],#做切片,去掉“主演:“这3个字符'time':item[4].strip()[5:],'score':item[5]+item[6] #将小数点前后的数字拼接起来}return itemsdef main():url = "https://www.maoyan.com/board/4"html = get_one_page(url)for item in parse_one_page(html):print(item)

效果如下:
在这里插入图片描述

3 保存至文件

def write_to_file(content):with open('result.txt','a',encoding='utf-8') as f:f.write(json.dumps(content, ensure_ascii=False) + '\n')  # 不允许写入ascii码f.close()def main():url = "https://www.maoyan.com/board/4"html = get_one_page(url)for item in parse_one_page(html):print(item)write_to_file(item)

效果如下:
在这里插入图片描述

4 开启循环及多线程

方式一:

def main(offset):url = "https://www.maoyan.com/board/4?offset="+str(offset)html = get_one_page(url)for item in parse_one_page(html):print(item)write_to_file(item)if __name__ == '__main__':for i in range(10):main(i*10)

方式二:

from multiprocessing import Pool
if __name__ == '__main__':pool = Pool() #创建一个进程池pool.map(main,[i*10 for i in range(10)])

4 整体代码

import requests
from requests.exceptions import RequestException
import re
import json
from multiprocessing import Poolheaders = {'User-Agent': 'Mozilla/5.0(Macintosh;Intel Mac OS X 10_11_4)AppleWebKit/537.36(KHTML,like Gecko)Chrome/52.0.2743.116 Safari/537.36'}# 提取单页内容,用try,except方便找bug
def get_one_page(url):try:response = requests.get(url, headers=headers)  # 传入headers参数if response.status_code == 200:return response.textreturn response.status_codeexcept RequestException:  # 捕获这个类型的异常return Nonedef parse_one_page(html):  # 定义一个函数用来解析html代码# 生成一个正则表达式对象pattern = re.compile('<dd>.*?board-index.*?>(\d+)</i>.*?data-src="(.*?)".*?name"><a'  # 此处换行+ '.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>'+ '.*?integer">(.*?)</i>.*?fraction">(.*?)</i>.*?</dd>', re.S)items = re.findall(pattern, html)# items是一个list,其中的每个内容都是一个元组# 将杂乱的信息提取并格式化,变成一个字典形式for item in items:yield {  # 构造一个字典'index': item[0],# 'image': item[1],'title': item[2],'actor': item[3].strip()[3:],  # 做一个切片,去掉“主演:”这3个字符'time': item[4].strip()[5:],  # 做一个切片,去掉“上映时间:”这5个字符'score': item[5] + item[6]  # 将小数点前后的数字拼接起来}def write_to_file(content):with open('result.txt', 'a', encoding='utf-8') as f:# a表示模式是“追加”;采用utf-8编码可以正常写入汉字f.write(json.dumps(content, ensure_ascii=False) + '\n')  # 不允许写入ascii码# content是一个字典,我们需要转换成字符串形式,注意导入json库f.close()def main(offset):url = 'https://maoyan.com/board/4?offset=' + str(offset)  # 把offset参数以字符串形式添加到url中html = get_one_page(url)for item in parse_one_page(html):  # item是一个生成器print(item)write_to_file(item)if __name__ == '__main__':pool = Pool()  # 创建一个进程池pool.map(main, [i * 10 for i in range(10)])  # map方法创建进程(不同参数的main),并放到进程池中

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/503978.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Maven编译报processing instruction can not have PITarget with reserveld xml name

在java项目中&#xff0c;平时我们会执行mvn clean package命令来编译我们的java项目&#xff0c;可是博主今天执行编译时突然报了 processing instruction can not have PITarget with reserveld xml name 这个错&#xff0c;网上也说法不一&#xff0c;但是绝大绝大部分是因…

Java求职技能清单(2024版)

一、Java基础扎实&#xff08;反射、集合、IO、NIO、多线程、设计模式、通信协议等基础技术&#xff09; &#xff08;一&#xff09;Java &#xff08;二&#xff09;网络IO &#xff08;三&#xff09;NIO模型 &#xff08;…

李沐动手学习深度学习——3.6练习

本节直接实现了基于数学定义softmax运算的softmax函数。这可能会导致什么问题&#xff1f;提示&#xff1a;尝试计算exp(50)的大小。 可能存在超过计算机最大64位的存储&#xff0c;导致精度溢出&#xff0c;影响最终计算结果。 本节中的函数cross_entropy是根据交叉熵损失函数…

CloudCompare使用-点云手动分割操作

点云手动分割操作 一、概述二、分割步骤1. 点击分割按钮2. 分割标题栏 一、概述 我们有时候需要对点云进行局部分割&#xff0c;就想对下面这个四棱锥和立方体的组合体给分离出来。 分离的效果如下&#xff1a; 二、分割步骤 1. 点击分割按钮 有两个入口 1. 菜单栏 2. 快…

爬虫入门到精通_基础篇5(PyQuery库_PyQuery说明,初始化,基本CSS选择器,查找元素,遍历,获取信息,DOM操作)

1 PyQuery说明&#xff1a; PyQuery是python中一个强大而又灵活的网页解析库&#xff0c;如果你觉得正则写起来太麻烦&#xff0c;又觉得BeautifulSoup语法太难记&#xff0c;如果你熟悉jQuery的语法那么&#xff0c;PyQuery就是你绝佳的选择。 安装 pip3 install pyquery2 …

代码随想录第二十五天 78.子集 90.子集II 491.非递减子序列

LeetCode 78 子集 题目描述 给你一个整数数组 nums &#xff0c;数组中的元素 互不相同 。返回该数组所有可能的子集&#xff08;幂集&#xff09;。 解集 不能 包含重复的子集。你可以按 任意顺序 返回解集。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&…

[伴学笔记]01-操作系统概述 [南京大学2024操作系统]

文章目录 前言jyy:01-操作系统概述 [南京大学2024操作系统]为什么要学操作系统?学习操作系统能得到什么? 什么是操作系统?想要明白什么是操作系统:时间线:1940s1950s-1960s1960-1970s年代. 信息来源: 前言 督促自己,同时分享所得,阅读完本篇大约需要10分钟,希望为朋友的技术…

数据迁移DTS | 云上MySQL 数据库迁移至达梦数据库

引入 云上 MySQL 数据库 —> 向达梦国产化数据库迁移 下载&安装 达梦客户端工具 DM->可参考之前国产化专栏达梦文章 创建模式 在客户端分别依次执行以下命令脚本&#xff08;这里没有通过客户端管理工具去创建达梦数据库的模式&#xff0c;当然也可以通过图形化界…

生命游戏(Game of life)(OpenMP实现)

目录 生命游戏&#xff08;Game of life&#xff09;&#xff08;OpenMP实现&#xff09;问题描述OpenMP代码实现 运行参考资料 生命游戏&#xff08;Game of life&#xff09;&#xff08;OpenMP实现&#xff09; 问题描述 OpenMP代码实现 #include <omp.h> #include …

基于springboot+vue的在线考试与学习交流平台

博主主页&#xff1a;猫头鹰源码 博主简介&#xff1a;Java领域优质创作者、CSDN博客专家、阿里云专家博主、公司架构师、全网粉丝5万、专注Java技术领域和毕业设计项目实战&#xff0c;欢迎高校老师\讲师\同行交流合作 ​主要内容&#xff1a;毕业设计(Javaweb项目|小程序|Pyt…

STL容器之string类

文章目录 STL容器之string类1、 什么是STL2、STL的六大组件3、string类3.1、string类介绍3.2、string类的常用接口说明3.2.1、string类对象的常见构造3.2.2、string类对象的容量操作3.2.3、string类对象的访问及遍历操作3.2.4、 string类对象的修改操作3.2.5、 string类非成员函…

表单类标签

姓名&#xff1a;<input type"text" name"userName"/> input标签 type类型是text name的属性值是userName 效果如下 密码&#xff1a;<input type"password" name"pwd" value"123456"/> 输入的值要个value相…