python爬虫学习笔记(一)

该笔记主要用于整理在进行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'   可以将字符串中的变量替换为变量的对应值。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值