python爬虫小记
- GET 方式: 访问某个网页前不需要在浏览器里输入链接之外的东西,因为我们只是想向服务器获取一些资源,可能就是一个网页。
- POST 方式:访问某个网页前需要在浏览器里输入链接之外的东西,因为这些信息是服务器需要的。 比如在线翻译,我们需要输入点英文句子,服务器才能翻译吧
url : 网址
resp: 响应
decode():字节转字符串
请求过程剖析:
-
服务器渲染:在服务器那边直接把数据和HTML整合在一起 统一返回给浏览器
在页面源代码中能看到数据
-
客户端渲染:第一次请求只要一个html骨架 第二次请求拿到数据进行数据展示
在页面源代码中看不到数据
熟练使用浏览器抓包工具
http协议: 浏览器与服务器之间数据交互遵守的协议
请求头的重要内容
- User-Agent: 请求载体的身份标识(用啥发送的请求)
- Referer : 防盗链(这次请求是从哪个页面来的?反爬会用到)
- cookie: 本地字符串数据信息(用户登录信息、反爬的token)
响应头的主要内容:
- cookie: 本地字符串数据信息(用户登录信息、反爬的token)
- 各种神奇的莫名其妙的字符串
反爬请求头
反爬请求头(UA头)
即用这些可以反反爬操作不必在用它浏览器自带的代码
百度 PC UA
User-Agent: Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)
User-Agent: Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)
request
get() 能向服务器发送了一个请求,请求类型为 HTTP 协议的 GET 方式
post() 也能向服务器发送一个请求,请求类型是 HTTP 协议的 POST 方式
注:在地址栏里输的链接都是get()方式
import requests
url="https://www.sogou.com/web?query=周杰伦"
resp=requests.get(url)
print(resp)
print(resp.text) 注:拿到页面源代码(调用requests库)
若被默认程序自动进入,需将其源代码中的network的user-agent内容复制粘到原程序,即
import requests
url="http://www.sogou.com/web?query=周杰伦"
dic={
"user-agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36 Edg/95.0.1020.44"
}
resp=requests.get(url,headers=dic)
print(resp)
print(resp.text)
注:加上请求头让服务器信服
import requests
url='https://fanyi.baidu.com/sug'
s=input("请输入你要翻译的英文单词: ")
dat={
'kw': s
}
resp=requests.post(url,data=dat)
print(resp.json())
requests获取百度翻译,变量为s可以自己随意输入(灵活性),为post型不是get. 发送post请求:发送的数据必须是放在字典中,通过data参数传递。json:将服务器返回的内容直接处理成json()
注:URL中的 ?后面为参数
使用完毕后记得 resp.close()
数据解析与提取
re解析
正则表达式
代码 | 意义 |
---|---|
. | 匹配除换行符以外的任意字符 |
\w | 匹配字母或数字或下划线 |
\s | 匹配任意的空白符 |
\d | 匹配任意数字 |
\b | 匹配单词的开始或结束 |
^ | 匹配字符串的开始 |
$ | 匹配字符串的结束 |
\n | 匹配一个换行符 |
\t | 匹配一个制表符 |
注:大写为反义
代码 | 意义 |
---|---|
\D | 匹配非数字 |
\W | 匹配非字母数字或下划线 |
\S | 匹配非空白符 |
a|b | 匹配字符a或b |
---|---|
[ ] | 从文本第一个字符查找中括号内的有无匹配,有则输出,无则跳下一个字符 |
[^ ] | 匹配除了字符组中字符的所有字符 |
量词:控制面前的元字符出现的次数
* | 重复零次或更多次 |
---|---|
+ | 重复一次或更多次 |
? | 重复零次或一次 |
{n} | 重复n次 |
{n,} | 重复n次或更多次 |
{n,m} | 重复n到m次 |
贪婪匹配或惰性匹配
.* | 贪婪匹配 |
---|---|
.*? | 惰性匹配(查最短的数据) |
re模块
注:可以给正则前加r
findall :匹配字符串中所有的符合正则的内容
finditer:匹配字符串中的所有内容(返回的是迭代器) 从迭代器中的拿到的内容需要 .group()
search:找到一个结果就返回,返回的结果是match对象 拿数据需要.group()
match:是从头开始匹配
即 lst=re.findall(r"\d+","我的电话是:10086,他的是:10010")
预加载正则表达式:
obj=re.compile(r"\d+")
注:compile 函数用于编译正则表达式
re.s 匹配换行符
注:如想要提取正则语句中的指定信息,只需把该.*? 括起来,然后加上 ?p<> 其中<>里为指定信息的名称
e g:
提取信息思路
- 拿到页面源代码 requests
- 通过re来提取想要的有效信息 re
strip() :移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。 注意:该方法只能删除开头或是结尾的字符,不能删除中间部分的字符