Python爬虫教程 - 100天从新手到大师(02Day)


前面我们学习了爬虫的基础知识,那么接下来我们就来学习如何在代码中实现我们的爬虫。

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的区别

  1. response.text
    类型:str 解码类型: requests模块自动根据HTTP 头部对响应的编码作出有根据的推测,推测的文本编码
    如何修改编码方式:response.encoding=”gbk”

  2. response.content
    类型:bytes
    解码类型: 没有指定 如何修改编码方式:response.content.decode(“utf8”)

获取网页源码的通用方式:

  1. response.content.decode()
  2. response.content.decode(“GBK”)
  3. response.text

以上三种方法从前往后尝试,能够100%的解决所有网页解码的问题

所以:更推荐使用response.content.decode()的方式获取响应的html页面

2. 实战爬取一张图片

思考

  1. 以什么方式打开文件
  2. 保存什么格式的内容

分析:

  1. 图片的url: https://img1.baidu.com/it/u=3512705912,438096433&fm=253&fmt=auto&app=138&f=JPEG?w=500&h=887
  2. 利用requests模块发送请求获取响应
  3. 以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)

在这里插入图片描述
如图:
因为我们已经被识别成了一个爬虫程序

我们使用爬虫去访问百度首页,其实已经是被检测到了是爬虫的身份
“”"
百度首页已经知道了我们是爬虫程序的情况下,为啥还是给我们返回了数据

  1. 拒绝我们的访问
  2. 数据不重要的话
  3. 返回给假数据

所以我们尽可能的要模拟正常的用户,模拟客户端(浏览器)去发送请求

解决办法:隐藏爬虫身份,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

  1. 对于服务端来说,反爬点
  2. 对于我们来说,它是模拟正常用户的其中一个部分

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后面会讲到 也是一种反爬

注:

频繁访问也会返回百度安全认证

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值