整理requests和正则表达式爬取猫眼Top100中遇到的问题及解决方案
最近看崔庆才老师的爬虫课程,第一个实战课程是requests和正则表达式爬取猫眼电影Top100榜单。虽然理解崔老师每一步代码的实现过程,但自己敲代码的时候还是遇到了不少问题:
问题1:获取response.text时出现中文乱码的问题
问题2:通过requests.get()方法获取的网页代码与网页源代码不一致的问题
问题3:正则表达式匹配内容为空(多次修改pattern,甚至直接copy崔老师视频中的pattern也输出为空)
问题1:获取response.text时出现中文乱码的问题
1 import requests
2 from requests.exceptions import RequestException
3 import re
4
5 def get_one_page(url):
6 try:
7 response = requests.get(url)
8 if response.status_code == 200:
9 return response.text
10 else:
11 return None
12 except RequestException:
13 return None
14
15 shili = get_one_page('http://maoyan.com/board/4?')
16 print(shili)
上述代码运行后出现中文乱码的问题,经过网上收集资料显示:requests是从服务器返回的Response Headers 中Content-Type中获取编码,若指定了Charset就根据指定识别编码,否则就使用默认的ISO-8859-1,当服务器不符合此规范时就会出现乱码。解决方案是根据requests中的utils模块的get_encodings_from_content()方法进行解码:
# 将上述代码中第9行进行修改
content = response.text.encode('ISO-8859-1').decode(requests.utils.get_encodings_from_content(response.text)[0])
return content
这样就顺利解决了中文乱码的问题,但是后面发现有更简单的方法(通过添加headers参数):
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecho) Chrome/85.0.4183.121 Safari/537.36'
}
response = requests.get(url, headers=headers)
问题2:通过requests.get()方法获取的网页代码与网页源代码不一致的问题
从network - Requests Headers下直接复制user-agent来添加请求头,发现得到的网页代码html属性是“android”:

正确的源代码应该是这样的:

经过与崔老师的代码比较并进行调试,发现是浏览器复制的请求头出现了问题:
浏览器直接复制的user-agent 是这样的:

于是我上网搜索请求头user-agent的构成,以Chrome为例:

将其分为四个部分:
(1)默认部分:Mozilla/5.0
(2)表示操作系统版本部分:(Windows NT 10.0; Win64; x64)
(3)表示搜索引擎部分:AppleWebKit/537.36 (KHTML, like Gecho)
(4)表示浏览器版本部分:Chrome/85.0.4183.121 Safari/537.36
发现通过浏览器直接复制的user-agent中操作系统版本不对,这是因为在F12代码页面下点击了左上角的手机模式,将其关闭即可。

问题3:正则表达式匹配内容为空(多次修改pattern,甚至直接copy视频中的pattern也输出为空)
敲代码时自己尝试写正则表达式,运行后没有报错但是返回空列表:
def parser_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)
print(items) def main():
url = 'https://maoyan.com/board/4?'
html = get_one_page(url)
parser_one_page(html) if __name__ == '__main__':
main()
后面发现直接复制URL时是https协议,改为http后能够正确返回pattern匹配内容。
非计算机专业爬虫小白,理论知识不足,欢迎计算机大神批评指正。
整理requests和正则表达式爬取猫眼Top100中遇到的问题及解决方案的更多相关文章
- 使用Requests+正则表达式爬取猫眼TOP100电影并保存到文件或MongoDB,并下载图片
需要着重学习的地方:(1)爬取分页数据时,url链接的构建(2)保存json格式数据到文件,中文显示问题(3)线程池的使用(4)正则表达式的写法(5)根据图片url链接下载图片并保存(6)MongoD ...
- requests和正则表达式爬取猫眼电影Top100练习
1 import requests 2 import re 3 from multiprocessing import Pool 4 from requests.exceptions import R ...
- Requests+BeautifulSoup+正则表达式爬取猫眼电影Top100(名称,演员,评分,封面,上映时间,简介)
# encoding:utf-8 from requests.exceptions import RequestException import requests import re import j ...
- python3.6 利用requests和正则表达式爬取猫眼电影TOP100
import requests from requests.exceptions import RequestException from multiprocessing import Pool im ...
- PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)
利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...
- 14-Requests+正则表达式爬取猫眼电影
'''Requests+正则表达式爬取猫眼电影TOP100''''''流程框架:抓去单页内容:利用requests请求目标站点,得到单个网页HTML代码,返回结果.正则表达式分析:根据HTML代码分析 ...
- Python 爬取 猫眼 top100 电影例子
一个Python 爬取猫眼top100的小栗子 import json import requests import re from multiprocessing import Pool #//进程 ...
- python爬虫:爬取猫眼TOP100榜的100部高分经典电影
1.问题描述: 爬取猫眼TOP100榜的100部高分经典电影,并将数据存储到CSV文件中 2.思路分析: (1)目标网址:http://maoyan.com/board/4 (2)代码结构: (3) ...
- 使用Beautiful Soup爬取猫眼TOP100的电影信息
使用Beautiful Soup爬取猫眼TOP100的电影信息,将排名.图片.电影名称.演员.时间.评分等信息,提取的结果以文件形式保存下来. import time import json impo ...
随机推荐
- C语言内存泄露很严重,如何应对?
摘要:通过介绍内存泄漏问题原理及检视方法,希望后续能够从编码检视环节就杜绝内存泄漏导致的网上问题发生. 1. 前言 最近部门不同产品接连出现内存泄漏导致的网上问题,具体表现为单板在现网运行数月以后,因 ...
- java调用C# webService发布的接口
java调用C# webService发布的接口 java调用C# webService方式有很多种我这里只介绍一种 首先需要引入axis的jar包 axis的maven坐标如下 <depend ...
- 透过UIRoot深入理解NGUI提供的屏幕适配方案
主要代码:UIRoot,UIOrthoCamera,UIRect.GetSides(UIPanel使用UIRect的)里的GetSides,代码量很少,但需要思考和测试验证. 一.UIRoot的基本内 ...
- 小程序mpvue中flyio的使用方法
Fly.js 一个基于Promise的.强大的.支持多种JavaScript运行时的http请求库. 有了它,您可以使用一份http请求代码在浏览器.微信小程序.Weex.Node.React Nat ...
- C# 转化成 json ,特殊字符的处理
//1.定义string jsonText0= "{\"beijing\":{\"zkkke\":\"2222\",\" ...
- 持续部署入门:基于 Kubernetes 实现蓝绿发布
前言 软件世界比以往任何时候都更快.为了保持竞争力,需要尽快推出新的软件版本,而不会中断活跃用户访问,影响用户体验.越来越多企业已将其应用迁移到 Kubernetes. 在 Kubernetes 中有 ...
- 关于取表中id最大值+1的select语句,哪种效率更高?
需求:取stock表中id最大值+1,作为下一个id值. 特殊情况:考虑到表中会没有值,max(id)会返回空,因此需要用case when进行判断. 实现一:select (case max(id) ...
- 采用GitOps的11大原因
Kubernetes允许我们单纯地使用声明性的配置文件来管理我们的应用部署和其他基础设施组件(例如,我们现在都是YAML开发者).这使我们能够把所有这些文件放到Git仓库中,然后把它挂到流水线上(Je ...
- Maven是什么? Maven的概念+作用+仓库的介绍+常用命令
Maven系列1 1.什么是Maven? Maven是一个项目管理工具,它包含了一个对象模型.一组标准集合,一个依赖管理系统.和用来运行定义在生命周期阶段中插件目标和逻辑. 核心功能 Maven的核心 ...
- xss中shellcode的调用
shellcode就是利用漏洞所执行的代码 在完整的xss攻击之中,会将shellcode存放在一定的地方,然后触发漏洞,引发shellcode. 1.远程调用执行js 可将js代码单独放在一个js文 ...