Python爬虫开发学习(一)

HTTP协议之请求

浏览器使用chrome,打开网页后打开调试,在 Network 中找到 Type=document  的请求(一般是第一条),就是请求的网站URL,点开后,Header->Request Headers 下的

-1.请求行

-2.请求头

Host 为请求的域名

User-Agent 为用户代理(身份标识)不同平台下不同版本浏览器都会有个不同的User-Agent,服务器通过User-Agent会知道请求的设备及浏览器,爬虫开发要模拟这个属性

Cookie:用来储存用户信息,服务器可能会根据请求是否携带cookie来判断是正常访问还是爬虫,以及要登陆的网站需要cookie,所以爬虫要携带cookie

Connection:keep-alive 支持长链接

Upgrade-Insecure-Requests:1 把不安全的请求转成安全请求(http->https)

-3.请求体

携带数据

GET请求没有请求体

POST请求有请求体

HTTP协议之响应

-1.响应头:

Set-Cookie:对方服务器通过该字段设置cookie到本地

-2.响应体:

URL地址对应的响应

requests模块学习

-1.安装:sudo pip3 install requests

-2.发送get、post请求,获取响应

import requests

# get请求
url = "http://www.baidu.com"
response = requests.get(url)
print(response)

# post请求
url = "http://www.baidu.com"
response = requests.post(url, data={请求体字典})
print(response)

-3.response的方法

import requests

# get请求
...

# post请求
...

# 通过此方法获得网页源码
print(response.content.decode())

# 或

response.encoding = "utf-8" # 指定编码
print(response.text)




response.request.url # 发送请求的url地址
response.url # response响应的url地址
response.request.headers # 请求头
response.headers # 响应请求

不一定每次都能获取到网页源码,这时候就要考虑修改编码格式

...

# 默认是utf-8
print(response.content.decode())

# utf-8获取不到修改为gbk
print(response.content.decode("gbk"))

# 上面2种都获取不到则使用text
print(response.text)

发送带headers的请求

...

# 一般带着user-agent就可以,不行的话带上除了cookie之外的其他参数,再不行全带上
header_dict = {"user-agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.8 Safari/537.36"}

response = requests.post(url, data={请求体字典}, headers=header_dict)

 -4.超时参数

response = requests.post(url, data={请求体字典}, headers=header_dict, timeout=3) # 超时时间为3s,超过3s会报错

-5.retrying模块学习

安装:sudo pip3 install retrying

使用retry模块:form retrying import retry

form retrying import retry


header_dict = {...}

# 如果函数报错的话会反复执行3次,期间没报错则继续执行后面的函数,如果全都报错整个程序才会报错
@retry(stop_max_attempt_number=3)
def _parse_url(url):
    response = requests.get(url, headers=header_dict, timeout=5)
    return response.content.decode()


def parse_url(url):
    try:
        htm_str = _parse_url(url)
    except:
        htm_str = None
    return htm_str

-6.处理cookie相关的请求

1)、cookie存放到headers中

...

header_dict = {"user-agent": "...", "cookie": "cookie 字符串"}

response = requests.post(url, data={请求体字典}, headers=header_dict)

2)、cookie字典传给cookie参数

...

header_dict = {"user-agent": "..."}

# 如果从浏览器中复制的cookie字符串要转成字典,可以使用下面的方式
"""
cookie_str = "param1=参数1; param2=参数2; param3=参数3"

cookie_dict = {i.split("=")[0]:i.split("=")[-1] for i in cookie.split("; ")}

"""

cookie_dict = {...}

response = requests.get(url, cookies=cookie_dict)

实际操作方法:先发送post请求,获取cookie,带上cookie请求登陆后的页面

1)、session = requests.session() # 实例化session,session具有的方法和requests一样

2)、session.post(url, data, headers) # 服务器设置在本地的cookie会保存在session中

3)、session.get(url) # 会带上之前保存在session中的cookie,能够请求成功

关于Chorme中network记录跳转页面会刷新清除的问题,可以勾选上 Preserve log 这样跳转页面后就不会清除掉记录了

发布了97 篇原创文章 · 获赞 21 · 访问量 28万+

猜你喜欢

转载自blog.csdn.net/sun124608666/article/details/102720523
今日推荐