最近看崔庆才老师的爬虫课程,第一个实战课程是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中遇到的问题及解决方案的更多相关文章

  1. 使用Requests+正则表达式爬取猫眼TOP100电影并保存到文件或MongoDB,并下载图片

    需要着重学习的地方:(1)爬取分页数据时,url链接的构建(2)保存json格式数据到文件,中文显示问题(3)线程池的使用(4)正则表达式的写法(5)根据图片url链接下载图片并保存(6)MongoD ...

  2. requests和正则表达式爬取猫眼电影Top100练习

    1 import requests 2 import re 3 from multiprocessing import Pool 4 from requests.exceptions import R ...

  3. Requests+BeautifulSoup+正则表达式爬取猫眼电影Top100(名称,演员,评分,封面,上映时间,简介)

    # encoding:utf-8 from requests.exceptions import RequestException import requests import re import j ...

  4. python3.6 利用requests和正则表达式爬取猫眼电影TOP100

    import requests from requests.exceptions import RequestException from multiprocessing import Pool im ...

  5. PYTHON 爬虫笔记八:利用Requests+正则表达式爬取猫眼电影top100(实战项目一)

    利用Requests+正则表达式爬取猫眼电影top100 目标站点分析 流程框架 爬虫实战 使用requests库获取top100首页: import requests def get_one_pag ...

  6. 14-Requests+正则表达式爬取猫眼电影

    '''Requests+正则表达式爬取猫眼电影TOP100''''''流程框架:抓去单页内容:利用requests请求目标站点,得到单个网页HTML代码,返回结果.正则表达式分析:根据HTML代码分析 ...

  7. Python 爬取 猫眼 top100 电影例子

    一个Python 爬取猫眼top100的小栗子 import json import requests import re from multiprocessing import Pool #//进程 ...

  8. python爬虫:爬取猫眼TOP100榜的100部高分经典电影

    1.问题描述: 爬取猫眼TOP100榜的100部高分经典电影,并将数据存储到CSV文件中 2.思路分析: (1)目标网址:http://maoyan.com/board/4 (2)代码结构: (3) ...

  9. 使用Beautiful Soup爬取猫眼TOP100的电影信息

    使用Beautiful Soup爬取猫眼TOP100的电影信息,将排名.图片.电影名称.演员.时间.评分等信息,提取的结果以文件形式保存下来. import time import json impo ...

随机推荐

  1. composer安装依赖包时,php内存分配不足

    Fatal error: Allowed memory size of 1610612736 bytes exhausted (tried to allocate 4096 bytes) in pha ...

  2. 【Android】Android开发初学者实现拨打电话的功能,拨打电话app小demo实现

    作者:程序员小冰,GitHub主页:https://github.com/QQ986945193 新浪微博:http://weibo.com/mcxiaobing 首先先给大家看一下最终实现的效果: ...

  3. java返回树形结构的正确姿势

    业务场景 通常我们前端需要一个树形的导航菜单或者分类菜单,如后台权限管理中的权限树,亦或者下面例子中商城系统的商品分类多级菜单(一般为三级菜单) 数据库设计 数据库设计,采用parentId来指向自己 ...

  4. 关于`ClawHub的技术分享`公众号

    生命不息,折腾不止! 该公众号的内容大部分为平时学习积累所整理的笔记,包括但不限于源码.原理.经验等. 如果感兴趣,也可以访问clawhub的博客主站https://clawhub.club

  5. Vue-router的用法与使用步骤

    Vue-router的使用步骤: Vue Router的使用步骤还是比较清晰的,按照步骤一步一步就能完成路由操作 A.导入js文件 B.添加路由链接 C.添加路由占位符(最后路由展示的组件就会在占位符 ...

  6. 使用HttpUrlConnection访问www.163.com遇到503问题,用设置代理加以解决

    一次我使用如下程序连接到网易,意图获取其网站的html文本: try { String urlPath = "http://www.163.com/"; URL url = new ...

  7. pwnable.kr之bof

    打开题目: 先下载题目给我们的两个文件,查看文件信息: 发现没有执行的权限,所以先增加文件bof的执行权限,执行: 没发现啥,然后查看代码, #include <stdio.h> #inc ...

  8. spring boot+spring security集成以及Druid数据库连接池的问题

    贴工程目录,其中bll目录下是service+dao层,common是一些公用的模块及功能类,web是controller层 用到了druid及Redis,工具及配置类目录(本文不介绍如何配置drui ...

  9. liunx配置本地yum源和更新aliyun yum源

    1.挂载DVD光盘到/mnt   因为配置时候路径名里面不能有空格,否则不能识别 [root@ mnt]# mount   /dev/cdrom   /mnt [root@ mnt]# umount ...

  10. jmeter的用途

    1.可以测接口 2.测试连数据库 3.可以进行压测 4.可部署分布式