目录
前面我们学习了爬虫的基础知识,那么接下来我们就来学习如何在代码中实现我们的爬虫。
1. requests库
"""
第三方模块: pip install requests -i https://pypi.doubanio.com/simple
在python当中 我们就使用第三方库requests去发送网络请求
"""
1.1 requests的作用
作用:发送网络请求,返回响应数据
中文文档 : http://docs.python-requests.org/zh_CN/latest/index.html
通过观察文档来学习:如何使用requests来发送网络请求
1.2 requests模块发送简单的get请求、获取响应
需求:通过requests向百度首页发送请求,获取百度首页的数据
test
import requests
# 程序入口
if __name__ == '__main__':
# 1.确认目标的url,注意点,url从network里面寻找,因为网页是由network里面所有数据包构成的
url_ = "https://www.baidu.com/?wd=wd" # 字符串的方式进行呈现
# 2.发送网络请求,得到响应对象
response_ = requests.get(url_) # 利用requests库发送网络请求,然后会得到一个响应对象response
# print(response_) # 响应对象 对象的形式
# 仅仅拿到响应对象没有用,我们要的是里面的数据
# print(response_.text) # 得到该url对应的响应代码(数据)
# print(type(response_.text)) # 响应response的text属性,得到的是string字符串类型的数据
print(response_.content.decode()) # 得到该url对应的响应代码(数据)
print(type(response_.content)) # 得到的是字节类型的数据
保存到本地
import requests
# 程序入口
if __name__ == '__main__':
# 1.确认目标的url
url_ = "https://www.baidu.com/"
# 2.利用requests库发送网络请求
response_ = requests.get(url_)
print(response_.encoding)
# 4.保存 由于text得到的是str类型,因此用w写入
with open('baidu_01.html','w',encoding="utf-8") as f:
f.write(response_.text) # 字符串类型
with open('baidu_02.html','wb') as f: # 注意点,wb二进制方式写入的话,是不需要加上encoding="utf-8"这个参数
f.write(response_.content) # 字节类型
保存的数据,现出了乱码
出现问题的原因:
从网络请求拿下来的数据,都是字节类型 我们使用text直接拿到的是字符串类型,没有进行解码操作
使用text会自动进行编解码操作 编解码格式问题,text会自动识别编解码格式,然后自动进行解码,不一定准确
由于text自作多情,检测错了编解码的格式,导致我们拿到的就是乱码数据
解决方法:直接使用content得到字节类型的数据
import requests
# 程序入口
if __name__ == '__main__':
# 1.确认目标的url
url_ = "https://www.baidu.com/"
# 2.利用requests库发送网络请求
response_ = requests.get(url_)
bytes_data = response_.content # 得到字节类型的数据
# 拿到了字节类型的数据,直接进行解码,默认使用的是utf-8的格式
str_data = bytes_data.decode() # 解码,字节 > str字符串类型
print(response_.encoding)
print(type(str_data))
print(str_data)
data_ = response_.text # ISO-8859-1
print(response_.encoding)
# print(data_)
# print(type(data_))
# 此时此刻 data_ ISO-8859-1
bytes_data = data_.encode('ISO-8859-1') # 使用它检测到的格式变成字节类型
# 拿到了字节类型的数据,使用utf-8进行解码,是不是就变成了我们看得懂的字符串
str_data = bytes_data.decode('utf-8')
print(str_data)
# 4.保存 由于text得到的是str类型,因此用w写入
with open('baidu_03.html', 'w', encoding="utf-8") as f:
f.write(str_data) # 字符串类型
with open('baidu_04.html', 'wb') as f: # 注意点,wb二进制方式写入的话,是不需要加上encoding="utf-8"这个参数
f.write(response_.content)
注:
想要pycharm终端中打开某个文件,就必须先cd进入到该文件所在的目录才行!!!!
pycharm直接打开的本地html文件,自动渲染一下,会自动请求某些需要的部分(图片的请求)
使用终端start打开的话,是什么就打开得就是什么,没有的就没有
经过以上的测试现在我们来完成这个需求
目的:是使用python代码去完成一个爬虫
爬虫:就是模拟客户端去发送网络请求,得到响应数据
目标数据:百度首页的response代码(数据),html格式的数据 目标url:https://www.baidu.com/
# 导入一个发送网络请求的第三方库
import requests
if __name__ == '__main__':
# 1.确认需要的数据的url,目标url,需要是一个字符串
url_ = "https://www.baidu.com/"
# 2.发送网络请求,获取响应对象
response_ = requests.get(url_)
# 2.1 取到里面的数据
bytes_data = response_.content # 字节类型的数据
# 2.2 解码 把字节类型的数据解码成字符串类型
str_data = bytes_data.decode()
print(str_data)
1.3 response的常用属性
response.text 响应体 str类型
respones.content 响应体 bytes类型
response.status_code 响应状态码
response.request.headers 响应对应的请求头
response.headers 响应头
response.request.cookies 响应对应请求的cookie
response.cookies 响应的cookie(经过了set-cookie动作)
import requests
# 1.确认需要的数据的url,目标url,需要是一个字符串
url_ = "https://www.baidu.com/"
# 2.发送网络请求,获取响应对象
response = requests.get(url_)
# response.status_code 响应状态码 200请求成功 301跳转 404页面找不到 500服务器出现了错误
# print(response.status_code)
# response.request.headers 响应对应的请求头
# print(response.request.headers) # 响应对象里面还包含了我们的请求信息(已经被服务端解析过了一次的请求信息)
# 代表着百度的服务器已经知道了我们是一个python爬虫,已经被识别到了是一个爬虫
# 'User-Agent': 'python-requests/2.24.0' (重点)
# 正常使用浏览器访问:用户代理(代理请求者的身份)
# User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
# response.headers 响应头
# print(response.headers)
# response.request.cookies 响应对应请求的cookie
# print(response.request._cookies) # 这是一个CookieJar对象
# response.cookies 响应的cookie(经过了set-cookie动作)
print(response.cookies)
思考:text是response的属性还是方法呢?
一般来说名词,往往都是对象的属性,对应的动词是对象的方法
1.4 response.text 和response.content的区别
response.text
类型:str 解码类型: requests模块自动根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
如何修改编码方式:response.encoding=”gbk”response.content
类型:bytes
解码类型: 没有指定 如何修改编码方式:response.content.decode(“utf8”)
获取网页源码的通用方式:
- response.content.decode()
- response.content.decode(“GBK”)
- response.text
以上三种方法从前往后尝试,能够100%的解决所有网页解码的问题
所以:更推荐使用response.content.decode()
的方式获取响应的html页面
2. 实战爬取一张图片
思考:
- 以什么方式打开文件
- 保存什么格式的内容
分析:
- 图片的url: https://img1.baidu.com/it/u=3512705912,438096433&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=887
- 利用requests模块发送请求获取响应
- 以2进制写入的方式打开文件,并将response响应的二进制内容写入
import requests
# 图片的url
url = 'https://img1.baidu.com/it/u=3512705912,438096433&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=887'
# 响应本身就是一个图片,并且是二进制类型
response = requests.get(url)
# print(response.content)
# 以二进制+写入的方式打开文件
with open('01.png', 'wb') as f:
# 写入response.content bytes二进制类型
f.write(response.content)
3. 发送带header的请求
import requests
url = 'https://www.baidu.com'
response = requests.get(url)
print(response.content)
# 打印响应对应请求的请求头信息
print(response.request.headers)
如图:
因为我们已经被识别成了一个爬虫程序
我们使用爬虫去访问百度首页,其实已经是被检测到了是爬虫的身份
“”"
百度首页已经知道了我们是爬虫程序的情况下,为啥还是给我们返回了数据
- 拒绝我们的访问
- 数据不重要的话
- 返回给假数据
所以我们尽可能的要模拟正常的用户,模拟客户端(浏览器)去发送请求
解决办法:隐藏爬虫身份,python-requests/2.28.1 隐藏起来
正常用户的脸(身份) : Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36
这时header的作用就体现出来了
header的形式:字典
headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36"}
用法
requests.get(url, headers=headers)
完整的代码
import requests
# 程序入口
if __name__ == '__main__':
# 1.确认目标的url
url_ = "https://www.baidu.com/?wd=wd"
# 实现User-Agent用户代理,隐藏爬虫身份,使用正常浏览器的身份
# 键名:User-Agent 值:正常浏览器的数据
headers_ = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"}
# 2.利用requests库发送网络请求,把用户代理User-Agent携带上,参数名称固定,headers
response_ = requests.get(url_,headers=headers_)
bytes_data = response_.content
str_data = bytes_data.decode()
# 4.保存到本地
with open('baidu_05.html','w',encoding="utf-8") as f:
f.write(str_data)
说明:User-Agent
- 对于服务端来说,反爬点
- 对于我们来说,它是模拟正常用户的其中一个部分
User-Agent用户代理只是其中一个
4. User-Agent池
需要短时间内连续访问很多次这样一个需求
headers_ = {"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"}
在服务器端会有记录 同一个User-Agent 3s 上百次 非正常用户行为,以此判断你是一个爬虫程序
解决办法:
使用User-Agent池
可以理解成是一个列表,很多的Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36100次请求,每一次请求,都从User-Agent池里面随机拿一个身份 张三 李四 王二。
test
import requests
# 简单演示如何使用
import random
# 1.使用列表,里面存放很多的User-Agent的值
user_agent_list = [
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/90.0.4515.131 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4515.131 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/93.0.4515.131 Safari/537.36",
"Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4515.131 Safari/537.36",
]
# 获取一个随机整数,作为列表的索引值
num = random.randint(0, 4) # 前后都包,0和4都有可能取到
print(num)
print(user_agent_list[num])
url_ = "https://www.baidu.com"
headers_ = {
"User-Agent":user_agent_list[num]
}
response_ = requests.get(url_,headers=headers_)
# 打印百度服务器检测到的用户代理身份
print(response_.request.headers)
还有一种方法
第三方库可以提供 fake-useragent
pip install fake-useragent -i https://pypi.doubanio.com/simple
注: 一般导入使用是下划线,下载的时候中横线
from fake_useragent import FakeUserAgent
import requests
user_agent_demo = FakeUserAgent().random # 这个random不需要导入
print(user_agent_demo)
url_ = "https://www.baidu.com"
headers_ = {
"User-Agent":user_agent_demo
}
response_ = requests.get(url_,headers=headers_)
# 打印百度服务器检测到的用户代理身份
print(response_.request.headers)
"""
终极方法
ctrl点击FakeUserAgent进入源码 > ctrl点击settings进入源码 > 第16行CACHE_SERVER这里有一个https,把s删掉 > 如果有弹窗,点击OK > 再把s删掉 > 多运行几遍
"""
5. url传参
打开百度输入春节
疑问:我们输入’春节’两个字 然后呢得到了相关的数据,页面
该页面是由谁给我们的 >> 服务器 >>
我们客户端告诉了服务器‘春节’ >> 也是一种数据,信息 >> 服务器 url: www.baidu.com
url 携带参数的情况 根据network里面的数据包的分析,图片都是一个单独的数据包,单独发送 html骨架
我们在网址栏输入的url,一般都是网页主框架的url 当浏览器拿到了该主框架的url的响应response之后
浏览器接收到了这个html文件的代码之后 它就会发现想呈现(渲染),发现里面有很多的坑坑洼洼 一个应该放图片的地方,它放的是图片的url
此时浏览器就会拿着坑里面的图片的url去自动发送网络请求 得到具体的响应之后,就填坑最终组成了一个完整的页面,给我们看
url携带参数的体现 只填入了 春节 两个字
"https://www.baidu.com/s?wd=%E6%98%A5%E8%8A%82&rsv_spt=1&rsv_iqid=0xa4bca0fb0001fe26&issp=1&f=8&rsv_bp=1&rsv_idx=2&ie=utf-8&tn=baiduhome_pg&rsv_enter=1&rsv_dl=tb&rsv_sug3=7&rsv_sug1=8&rsv_sug7=100&rsv_sug2=0&rsv_btype=i&inputT=2311&rsv_sug4=2311&rsv_sug=1"
障眼法
某些参数其实是不影响我们的请求结果
自url的? 之后的都是参数:以键值对的方式存在 a=a1
经过分析,只有wd=春节 这个键值对(参数)是必须的
百度输入框搜索一下的 关键字 实际上就是传给url wd = xxxx word
新的问题:
在network里面发现,传给服务器的参数, wd = 春节 wd = %E6%98%A5%E8%8A%82
中文传参不是那么的友好方便,中文经过浏览器的解析发送给服务器 春节 > %E6%98%A5%E8%8A%82
转义部分直接进行请求,也是可以的
类似的url即可的转义 了解
from urllib.parse import quote,unquote
# 明文(看得懂的数据): 春节 固定的关系映射表(固定的格式) > 密文(看不懂的) 加密的场景
data_ = "春节" # %E6%98%A5%E8%8A%82
print(quote(data_)) # %E6%98%A5%E8%8A%82
# 密文转为明文
print(unquote('%E6%BB%91%E6%9D%BF')) # 春节
# %E6%98%A5%E8%8A%83 # 春卷
5. 1 方法一
url传参,爬虫演示 第一种 携带参数直接放在url里面
# 导入发送网络请求的requests库
import requests
# 程序入口
if __name__ == '__main__':
input_wd = input("请输入你想搜索的关键字:")
# 1.确认目标的url
# 这里用http 不然会返回安全认证
url_ = f"http://www.baidu.com/s?wd={input_wd}"
# 1.1添加用户代理User-Agent,伪造身份
headers_ = {
"Cookie": "BIDUPSID=B2F6F28007FE9A5EDD64F98E42B1596B; PSTM=1657112864; BDUSS=VKSnpYR0x5bnVPcTFmUlpOfk1aRWZMQVlrNzkzblQ2S08xcy1LV2RJVHhIRXBqSVFBQUFBJCQAAAAAAQAAAAEAAAA0O58LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPGPImPxjyJjb1; BDUSS_BFESS=VKSnpYR0x5bnVPcTFmUlpOfk1aRWZMQVlrNzkzblQ2S08xcy1LV2RJVHhIRXBqSVFBQUFBJCQAAAAAAQAAAAEAAAA0O58LAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPGPImPxjyJjb1; BAIDUID=69CE10AEF1E14473B376947B595D859C:FG=1; BAIDUID_BFESS=69CE10AEF1E14473B376947B595D859C:FG=1; BD_HOME=1; BDRCVFR[feWj1Vr5u3D]=I67x6TjHwwYf0; delPer=0; BD_CK_SAM=1; rsv_jmp_slow=1690258254217; shifen[2161476_62247]=1690266068; shifen[2161476_91638]=1690266070; shifen[2087047_91638]=1690268305; BD_UPN=12314753; PSINO=3; __bid_n=18a321ba2e24032c3c74be; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; Hm_lvt_aec699bb6442ba076c8981c6dc490771=1694264577; shifen[438757621114_38634]=1694264579; shifen[667315665256_63796]=1694264587; shifen[451441355700_51286]=1694265534; shifen[661202972713_27]=1694266467; ZFY=jZ0FDjYLgUZf3lkVXJP2tvSwI8LEougAWVc20rURRbM:C; BA_HECTOR=808k8k8k000105aga08g2k271ifvjr31p; Hm_lpvt_aec699bb6442ba076c8981c6dc490771=1694486376; BDRCVFR[dG2JNJb_ajR]=mk3SLVN4HKm; BDRCVFR[-pGxjrCMryR]=mk3SLVN4HKm; BDRCVFR[tox4WRQ4-Km]=mk3SLVN4HKm; shifen[186083365897_97653]=1694506518; BCLID=9421174716424803092; BCLID_BFESS=9421174716424803092; BDSFRCVID=LgFOJeC62xbs6fcq05teuVdpymTXpVjTH6ao-cCBoDFx5ZK1zqaAEG0PSx8g0Kub9Ib-ogKKLmOTHpCF_2uxOjjg8UtVJeC6EG0Ptf8g0f5; BDSFRCVID_BFESS=LgFOJeC62xbs6fcq05teuVdpymTXpVjTH6ao-cCBoDFx5ZK1zqaAEG0PSx8g0Kub9Ib-ogKKLmOTHpCF_2uxOjjg8UtVJeC6EG0Ptf8g0f5; H_BDCLCKID_SF=JnK8_K0MJD83fP36qRAVb-LyMfJXetJyaR0qXx7vWJ5TMCoG-frO5-tEK-FOKRQp5TR8B4bDJfD-ShPC-tPMQR_EjtKfBbo42KQm2T6w3l02Vb3Ee-t2yUKI0GQvqPRMW23rWl7mWPJTsxA45J7cM4IseboJLfT-0bc4KKJxbnLWeIJ9jjCMejcWjN0qJ5nfb5kXXT6e54OEenuk-PnVeP_iMPnZKxtqtjTKaRv2KbQ2jKT15qjfKbFt5MDqQ65nWncKWKbI-RLhEC3oKfoOMxtTqJr405OT52DO0KJc3q6ChfP9hPJvyUADXnO7bUJlXbrtXp7_2J0WStbKy4oTjxL1Db3JKjvMtT-tVD8yJIDhMD8Gen3E-n-tKUAX5-CsLJct2hcH0KLKDJvM2JK5bR8JeHQtLt3jMCjxXJOstMb1MRjvh5OUQ6tLefvxbncq-bcBBq5TtUJB8DnTDMRhXjt72-OyKMniBIj9-pnM0hQrh459XP68bTkA5bjZKxtq3mkjbPbDfn02eCKuj5uBjTbQjG-s-bbfHj-L0n5b2R3_KROvhjRN2MtgyxomtjjtKm5WLnOD-nnjD-5Kbb3BMJ0EjRLqLUkqKC8JKtjDJl_bOPjHMP6TXKu4QttjQPbufIkjahQzLDjibb7TyURdhf47yh3m0q4Hb6b9BJcjfU5MSlcNLTjpQT8r5MDOK5OOJRLeoIPhJC8hMDk455jBq4u-bMnf2D62aKDs2n3IBhcqEIL42-55j4KSKH0t-PQtQDnjXR6myPJ4jxbSj4QoqttdLxnR0Jktye0DXtjq0l5nhMJb257JDMP0-GrA5Dry523i2n6vQpn2EpQ3DRoWXPIqbN7P-p5Z5mAqKl0MLPbtbb0xb6_0-nDSHHLqJjKJ3H; H_BDCLCKID_SF_BFESS=JnK8_K0MJD83fP36qRAVb-LyMfJXetJyaR0qXx7vWJ5TMCoG-frO5-tEK-FOKRQp5TR8B4bDJfD-ShPC-tPMQR_EjtKfBbo42KQm2T6w3l02Vb3Ee-t2yUKI0GQvqPRMW23rWl7mWPJTsxA45J7cM4IseboJLfT-0bc4KKJxbnLWeIJ9jjCMejcWjN0qJ5nfb5kXXT6e54OEenuk-PnVeP_iMPnZKxtqtjTKaRv2KbQ2jKT15qjfKbFt5MDqQ65nWncKWKbI-RLhEC3oKfoOMxtTqJr405OT52DO0KJc3q6ChfP9hPJvyUADXnO7bUJlXbrtXp7_2J0WStbKy4oTjxL1Db3JKjvMtT-tVD8yJIDhMD8Gen3E-n-tKUAX5-CsLJct2hcH0KLKDJvM2JK5bR8JeHQtLt3jMCjxXJOstMb1MRjvh5OUQ6tLefvxbncq-bcBBq5TtUJB8DnTDMRhXjt72-OyKMniBIj9-pnM0hQrh459XP68bTkA5bjZKxtq3mkjbPbDfn02eCKuj5uBjTbQjG-s-bbfHj-L0n5b2R3_KROvhjRN2MtgyxomtjjtKm5WLnOD-nnjD-5Kbb3BMJ0EjRLqLUkqKC8JKtjDJl_bOPjHMP6TXKu4QttjQPbufIkjahQzLDjibb7TyURdhf47yh3m0q4Hb6b9BJcjfU5MSlcNLTjpQT8r5MDOK5OOJRLeoIPhJC8hMDk455jBq4u-bMnf2D62aKDs2n3IBhcqEIL42-55j4KSKH0t-PQtQDnjXR6myPJ4jxbSj4QoqttdLxnR0Jktye0DXtjq0l5nhMJb257JDMP0-GrA5Dry523i2n6vQpn2EpQ3DRoWXPIqbN7P-p5Z5mAqKl0MLPbtbb0xb6_0-nDSHHLqJjKJ3H; ab_sr=1.0.1_NTcwNjg4ZjIwODZhN2I1YWQ2ZTAzNDc5OTZiODkwMDEyNThhMDJkZmIzNzk2MWYwYWE4ZjBiOTg4NDY4M2JjMGViMTBhZDNiNWFmMjRiNWU3YzQ4NjdhM2NmN2VmZWE3YzlhMzUzZTA0YjcwNTE3MTUwYzcyNmI1ODY2MWJlNmUzY2E3NDdjMDU5ZDJkMWEyYWQ0NDg1NzU2NDcxYWZjOQ==; baikeVisitId=e9b92b2d-f5ab-4a82-b2f8-8110a108c234; H_PS_PSSID=39324_39282_39222_39351_39097_39198_39293_39261_39358_39241_39233_39290_26350_39239_39149; B64_BOT=1; sugstore=1; H_PS_645EC=0548JGhdq6XJB4DuZBGHSxhXlt2lXxCMbPurrS%2BLqk1rQN4MhWZTvtTx19V4F27sCJSI; COOKIE_SESSION=113_5_6_9_1_17_1_0_3_7_0_3_0_240052_0_0_1694265550_1694506520_1694508722%7C9%23241922_74_1694506516%7C9",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36"}
# 2.发送网络请求,获取响应对象
response_ = requests.get(url_, headers=headers_)
# 2.1 提取出里面的文本数据
bytes_data = response_.content
str_data = bytes_data.decode() # 默认是utf-8 解码
# print(str_data)
# 3.解析(目前略过)
# 4.保存到本地
with open(f'baidu_{input_wd}.html', 'w', encoding="utf-8") as f:
f.write(str_data)
5. 2 方法二
url传参第二种 发送请求的时候再进行传参携带,而不是直接放在url里面
# 导入发送网络请求的requests库
import requests
# 程序入口
if __name__ == '__main__':
# 手动输入关键字
input_wd = input("请输入你想搜索的关键字:")
# 1.确认目标的url
url_ = "http://www.baidu.com/s?"
# 1.1添加用户代理User-Agent,伪造身份
headers_ = {
"Cookie": "BAIDUID=AE16EE27343B25D5DBD37EE0580AA351:FG=1; PSTM=1627283384; BIDUPSID=E87874A693DB88716FD0E61C71073BCC; BD_UPN=12314753; __yjs_duid=1_be57b8bfc8bffacdf8573b0697073d511627307214203; sugstore=0; BDUSS=BFTWV4MGNSNVNzLVlTWlFLbDY5RGhYTkQ5ZzQ0eWd-M2dMWTEyS0tpRlNyd1JpRVFBQUFBJCQAAAAAAAAAAAEAAAC8Ped2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIi3WFSIt1hdz; BDUSS_BFESS=BFTWV4MGNSNVNzLVlTWlFLbDY5RGhYTkQ5ZzQ0eWd-M2dMWTEyS0tpRlNyd1JpRVFBQUFBJCQAAAAAAAAAAAEAAAC8Ped2AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAFIi3WFSIt1hdz; BDORZ=B490B5EBF6F3CD402E515D22BCDA1598; MCITY=-158%3A; BCLID_BFESS=8335763491484922959; BDSFRCVID_BFESS=eTtOJeC62lglgzQHPXGJIGgdQpyGp_JTH6aoMw3AQf0BsIvX45xeEG0PsM8g0KAb9HVXogKKLmOTHpKF_2uxOjjg8UtVJeC6EG0Ptf8g0f5; H_BDCLCKID_SF_BFESS=tb4q_KDKtIt3fP36q46EhRtJ5f6tet6-bn3--PbvWJ5TMCo1bPvJ2l_n0b7xBfcx5KnIQPTT-U7kShPC-tnY5TtF0fDj3JJAbH-J_4nH3l02V-OEe-t2yU_Vet7pXPRMW23rWl7mWPJvsxA45J7cM4IseboJLfT-0bc4KKJxbnLWeIJIjj6jK4JKjatOtT5P; delPer=0; PSINO=6; BD_HOME=1; BD_CK_SAM=1; COOKIE_SESSION=17142_1_7_9_19_11_1_0_7_7_1_0_63048_0_0_0_1643251983_1643181011_1643269122%7C9%23348651_520_1643181008%7C9; H_PS_PSSID=35413_35786_35104_35488_35777_34584_35491_35245_35797_35326_26350_35746; BDRCVFR[feWj1Vr5u3D]=mk3SLVN4HKm; H_PS_645EC=3080yv57k87I1%2FZIKU0HQdbyG7oOI0QPwSV8hhw930gA%2B2jaz4ZbS6GUHqg; BA_HECTOR=8g8g042ga08ka4054i1gv572h0q; baikeVisitId=56c9aa21-f2cb-40da-a898-54bedc816d72",
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/92.0.4515.131 Safari/537.36"}
# 设置字典,用来url携带参数
params_ = {
'wd': input_wd
}
# 2.发送网络请求,获取响应对象
# 目标url 用户代理 url传参:把字典键值对自动拼接到url上面去
response_ = requests.get(url_, headers=headers_, params=params_)
# 2.1 提取出里面的文本数据
bytes_data = response_.content
str_data = bytes_data.decode() # 默认是utf-8 解码
# 3.解析(目前略过)
# 4.保存到本地
with open(f'baidu_{input_wd}.html', 'w', encoding="utf-8") as f:
f.write(str_data)
问题:
只要没有拿到想要的数据 返回百度安全认证
就是被反爬了,被识别出来了是一个爬虫程序
这里header加了Cookie和user-agent 还是会返回百度安全验证
解决方法:把https换成http
Cookie:前后端的会话记录
Cookie后面会讲到 也是一种反爬
注:
频繁访问也会返回百度安全认证