首先下载requests包
pip install requests
请求参数放在url后面
参数会被编码成二进制数据
请求参数放在form Data表单数据
包含了请求时的头部信息,如user-agent,host,cookie等
请求时额外的数据,如表单提交的数据
import requests
req = requests.get("https://www.baidu.com/")
# 输入请求的url
print(req.url)
# 以文字形式输出,设置编码格式可以通过head标签内的charset=utf-8
req.encoding = 'utf-8'
print(req.text)
# 以二进制的形式输出
print(req.content)
# 返回响应的状态码
print(req.status_code)
# 返回请求头
print(req.headers)
我们在必应搜索时可以发现https://cn.bing.com/search**?q=Python**
后面传入了params内容,如果每次都需要我们人为的在网页后面添加,那么就显得太麻烦了,但是requests可以通过设置params的值的传入来修改
import requests
# 这个网页可以判断请求是否为get请求,如果是就会返回相应的请求信息
params = {
'name': 'mike',
'age': '20'
}
req = requests.get('https://www.httpbin.org/get', params=params)
print(req.text)
print(req.url)
'''
运行结果,可以看到params的内容已经传入,而且url也自动变成了https://www.httpbin.org/get?name=mike&age=20
{
"args": {
"age": "20",
"name": "mike"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Host": "www.httpbin.org",
"User-Agent": "python-requests/2.28.2",
"X-Amzn-Trace-Id": "Root=1-644fe045-75277fe35a3fe2af4af2f6b7"
},
"origin": "36.143.62.142",
"url": "https://www.httpbin.org/get?name=mike&age=20"
}
https://www.httpbin.org/get?name=mike&age=20
'''
这里我们演示的是抓取logo图片,其他二进制文件也一样
import requests
'''
网页的图片 视频 音频等都是以二进制的形式存储,那么最快将其保存到本地的方法就是抓取二进制数据写入本地文件
'''
# 以CSDN的logo为例
req=requests.get('https://img-home.csdnimg.cn/images/20201124032511.png')
with open('logo.png','wb') as f:
# 二进制数据用content
f.write(req.content)
然后项目下的文件内就多了一个logo.png的文件
打开后可以看到图片已经被爬取下来了
某些网页在打开时会出现返回结果异常,导致网页抓取失败,很有可能是没有发送请求头
默认请求头 “User-Agent”: “python-requests/2.28.2”
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.64'
}
req = requests.get('https://www.baidu.com/',headers=headers)
# 打印出headers中的User-Agent值
print(req.request.headers['User-Agent'])
相似于get请求,但是请求的内容是隐蔽的,不会让人直接看到
data={
'name':'mike',
'age':'20'
}
req=requests.post('https://www.httpbin.org/post',data=data)
print(req.text)
'''
运行结果
{
"args": {},
"data": "",
"files": {},
"form": {
"age": "20",
"name": "mike"
},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Content-Length": "16",
"Content-Type": "application/x-www-form-urlencoded",
"Host": "www.httpbin.org",
"User-Agent": "python-requests/2.28.2",
"X-Amzn-Trace-Id": "Root=1-64508974-6097b14d2006be36054b4282"
},
"json": null,
"origin": "36.143.62.142",
"url": "https://www.httpbin.org/post"
}
'''
我们在一些有上传需求的网页时可以在新增file值
基于post请求
file = {
'file': open('logo.png', 'rb')
}
req = requests.post('https://www.httpbin.org/post', files=file)
print(req.text)
'''
输出文件多了一个file,由于篇幅太长就不打印了
{
"args": {},
"data": "",
"files": {
"file": "data:application/octet-stream;base64,iVBO……
},
"form": {},
"headers": {
"Accept": "*/*",
"Accept-Encoding": "gzip, deflate, br",
"Content-Length": "8076",
"Content-Type": "multipart/form-data; boundary=24025866637ba27c97048c8ccf051d2b",
"Host": "www.httpbin.org",
"User-Agent": "python-requests/2.28.2",
"X-Amzn-Trace-Id": "Root=1-645089a9-69bc939f1bfcf5b72c1f044e"
},
"json": null,
"origin": "36.143.62.142",
"url": "https://www.httpbin.org/post"
}
'''
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-mnSqJXV4-1683002360002)(D:\我的坚果云\python学习\python爬虫\图片\QQ截图20230502120153.png)]
我们可以按f12进入开发者选项点击网络,在出现请求里点一个xhr类型的请求,就可以看到本地的cookie
SSL证书验证:
在出现这个错误时
requests.exceptions.SSLError: HTTPSConnectionPool(host=‘ssr3.scrape.center’, port=443): Max retries exceeded with url: / (Caused by SSLError(SSLCertVerificationError(1, ‘[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1002)’)))
需要使用
'''通过设置cookie模拟登录,会出现SSL证书错误
可以通过设置verify=True去使其不验证证书,但是会出现警告
可以通过urllib3.disable_warnings()去忽略警告
也可以指定本地证书去用作客户端的证书,这里就不展示了
'''
urllib3.disable_warnings()
headers = {
'Cookie': '输入你的值'
}
req = requests.get('https://github.com/', headers=headers,verify=False)
print(req.text)
传入timeout参数
'''
对timeout的值进行赋值设置超时时会抛出异常--'Read timed out'
请求分为连接和读取两个过程
timeout可以传入元组(1,5)分别用作两个过程的值
'''
req=requests.get('https://www.baidu.com',timeout=0.01)
首先导入from requests.auth import HTTPBasicAuth
这个可以实现登录功能
req = requests.get('https://ssr3.scrape.center/', auth=HTTPBasicAuth('admin', 'admin'), verify=False)
print(req.status_code)
print(req.text)
为什么使用代理*:
* 在多次请求同一个网站时*,会有可能出现一些验证码验证或者登录,甚至封ip,*为了解决这种情况我们可以使用代理
代理分为免费代理和付费代理,一般在网上可以找得到,具有时效性,付费代理只有你一个人使用比较稳定,免费代理可能就会有一些问题
proxies={
'http':'http://112.250.107.37:1080',
'https':'https://51.222.21.92:1080'
}
req = requests.get('',proxies=proxies)
我们在网上找到的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6CaIqq4v-1683002360002)(D:\我的坚果云\python学习\python爬虫\图片\image-20230502121230491.png)]
可以看到有ip和port还有类型
因此我们的格式也是这样
‘类型’:‘类型://ip:port’
使用https://www.httpbin.org/cookies来检测
**注意:**这个网页可能比较慢,请耐心多试几次
'''
我们在打开网页时,第一次请求可能打开了一个网页,第二次请求打开了不同的页面,这是因为两次请求的Session不同,
解决方法:
1. 设置Cookie 缺点:繁琐
'''
import requests
requests.get('https://www.httpbin.org/cookies/set/name/123')
req=requests.get('https://www.httpbin.org/cookies')
print(req.text)
'''
输出:
{
"cookies": {}
}
可以发现这里的cookie并不能保存
'''
req1=requests.Session()
req1.get('https://www.httpbin.org/cookies/set/name/123')
req2=requests.get('https://www.httpbin.org/cookies')
print(req2.text)
'''
输出:
{
"cookies": {
"name": "123"
}
}
'''
这里就出现网页对cookie的验证问题,因此仅仅靠 auth=HTTPBasicAuth(‘账号’, ‘密码’)是不够的,还要传入cookie值
import requests
from requests.auth import HTTPBasicAuth
headers = {
'Cookie':'你的cookie'
}
req = requests.get('http://i.chaoxing.com/base?t=1619006147586', headers=headers,
auth=HTTPBasicAuth('账号', '密码'))
print(req.status_code)
print(req.text)
这是在这个网站上找到的内容,IP提取结果_免费代理IP_免费HTTP代理IP_SOCKS5代理服务器_优质IP代理_89免费代理IP (89ip.cn)
接下来我们要先爬取这些网页上的值,然后将其中不能使用的代理进行排除
import requests
from parsel import Selector
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/112.0.0.0 Safari/537.36 Edg/112.0.1722.64'
}
req = requests.get('https://www.89ip.cn/tqdl.html?num=60&address=&kill_address=&port=&kill_port=&isp=')
selector = Selector(text=req.text)
items = selector.xpath('/html/body//div[3]/div[1]/div/div/text()')
i = 1
proxie = []
for item in items:
print(i, item.get().strip())
proxie.append(item.get().strip())
i += 1
for i in proxie[:-2]:
proxies = {
'http': 'http://' + i,
}
print(proxies)
try:
r = requests.get('https://movie.douban.com/top250', headers=headers, proxies=proxies, timeout=1)
print(r.status_code)
if r.status_code != 200:
proxie.remove(i)
except:
proxie.remove(i)
print("failed:{}".format(i))
print(len(proxie))