该笔记主要用于整理在进行python爬虫学习中笔者认为比较重要的笔记,主要来自于bilibili和几本入门书籍中的内容,篇幅有限,具体示例可查看bilibili等资源和相关书籍。
一 网页信息查看
在浏览器网页中按F12键可以打开开发者界面。
网页源代码:执行脚本前的原始代码,是python爬虫可以获取的内容;
元素:执行脚本后的HTML代码,可以实时编辑,比如去除网页中的广告等不需要的信息;
网络:抓包工具,整个页面下载过程中所有加载的东西,展现页面结构,在XHR下可以查看python爬虫中所需的参数信息;
资源:页面中使用的所有资源,可进行代码调试等操作。
二 python模块
2.1 requests模块 使用什么命令取决于具体网页
resp = requests.get(url)
resp.encoding='uft-8' # 解决中文乱码问题 检查源代码中的charset属性
print(resp.text) # 输出页面源代码
# 将页面源代码写入文件
with open('file.html',mode='w',encoding='utf-8') as f:
f.write(resp.text)
set_data = {'kw':'keyword'} # set_data = {'kw':input('请输入关键词')}
resp = requests.post(url,data=set_data)
print(resp.text)
print(resp.json) # 如果返回的是json
其他请求不常见,暂不列出。
2.2 re模块
背景知识:
正则表达式——用于匹配字符串的一门表达式语言(https://toosl.oschina.net/regex/)
正则表达式支持:
普通字符
元字符(用一个符号匹配一堆内容):
\d:单个数字
\w:单个字母或数字或下划线
\D \W:取反
[]:匹配中括号中任意字符
[^]:取反
.:匹配除换行符之外的其他所有内容
量词(控制元字符出现的频次):
+:元字符出现一次或多次
*:元字符出现零次或多次(贪婪匹配)
?:元字符出现零次或一次
正则表达式中一个非常重要的用法 .*? 惰性匹配
re模块使用:
re.findall(正则表达式, 源字符串) # 返回匹配后的列表
re.search(正则表达式, 源字符串) # 返回re.Match对象
re.search.group() # 返回值
# 注意:search只返回匹配到的第一个值
re.finditer(正则表达式, 源字符串) # 返回一个迭代器,把所有结果放在一个迭代器中
for item in re.finditer(正则表达式, 源字符串) :
print(item.group()) # 如果不写group则返回re.Match对象
# 从输出结果上来看,re.findall和re.finditer都可以获取所有的匹配结果,但后者将所有结果存到一个迭代器中,更节省内存资源。
# 预加载 将正则表达式预先存储起来,使用时直接调用即可,可以反复使用,也适用于表达式很长的情况
obj = re.compile(正则表达式)
obj.findall(源字符串)
# 使用(?P<组名>.*?) 将所需的数据单独分组,这样可以仅提取所需信息而去除为提取信息而输入的匹配参数
A = item.group('组名')
print(A)
item.groupdict() # 输出组名:内容(即字典形式)
三 应用实战
resp.resquest.headers 请求头
resp.headers 响应头
一些网站会设置反爬,Use-Agent(UA)服务器对当前的网络设备进行检测
head = {'Use-Agent':xxxxx} # 具体应该是什么内容可从浏览器中查找
resp = resquests.get(url,headers=head) # 处理反爬
使用正则表达式时注意单双引号的使用
如果互为分隔的一长段中只有部分内容是需要的,则可以
obj = re.compile(r'区分内容1.*?区分内容2(?P<组名>.*?)区分内容3')只有用括号括起来的内容是所需的 .*?可以过滤无用的东西,也可以提取有用的东西(?P<组名>.*?)
.无法匹配换行符,所以在执行中到换行符就不再继续匹配了,所以需要re.compile(xxxx,re.S)
re.S可以让re匹配到换行符
然后
result = obj.finditer(resp.text)
for item in result:
print(item.groupdict())
抓取网页内容时,网页可能不会在同一页面中显示全部信息,即存在换页,此时需要注意不同页面之间url的规律,根据规律进行url的设置并获取全部内容。
补充知识点:
str.strip() # 去掉字符串左右两端的空白(空格,换行符,制表符)。
f'str1{变量}str2' 可以将字符串中的变量替换为变量的对应值。