Python爬虫——HTTP请求 & Request库 & Urllib库

Part 1 HTTP请求

HTTP请求: 从客户端到服务端的请求消息
请求方法→请求头部→请求正文
在这里插入图片描述

1.1 HTTP请求方法
GET方法
请求回到指定的页面信息,并返回实体主体。
POST方法
向指定资源提交数据进行处理请求(例如:提交表单或上传文件,用户登陆等等),数据被包含在请求体中。
其他请求方法如:
HEAD、PUT、DELETE、CONNECT、OPTIONS、TRACE等
1.2 HTTP请求头部
一般网站服务器最常见的反爬虫措施就是通过读取请求头部的用户代理(User Agent)信息来判断这个请求是来自正常的浏览器还是爬虫。

Part 2 Requests基础

2.1Request请求方法

Request库的get()方法:
respone=request.get(url)
构造一个向服务器请求资源的url的对象,这个对象是request库内部生成的。
respone返回的是一个包含服务器资源的对象。包含服务器返回的所有相关资源。
url
url是通过http协议存取资源的一个路径,就像电脑中的文件路径一样
requests.get(url,params=None,** kwargs)
url: 获取页面的url链接
params:url中的额外参数,字典或字节流格式,可选
** kwargs:12个控制访问的参数。

2.2 respone对象常用属性

HTTP请求返回状态:respone.status_code
HTTP状态码:
200——请求成功
301——资源被转移
404——请求资源不存在
418——触发了反爬虫机制
500——服务器内部错误

response.status_code == requests.codes.ok

上述代码可以验证HTTP请求是否成功,因为有些服务器的状态码201也表示请求成功,为了更好的验证请求成功,可以利用上述代码。

HTTP响应的字符串形式,即url对应的页面容:respone.text:
获得HTTP 的编码方式:respone.encoding
更改HTTP响应的编码方式:

response.encoding='utf-8'

HTTP的二进制响应:respone.content可以利用二进制响应下载图片。

2.2 网页源代码提取

import requests
response=requests.get('https://www.baidu.com/')  #读取网页
response.encoding='utf-8'
re_text=response.text     #返回文本内容
re_text2=response.content  #查看二进制响应
print(re_text)
print(re_text2)
if response.status_code==requests.codes.ok:#检查HTTP是否请求正确
    print(response.status_code)
print(response.encoding)

当然,这种代码下是无法获取网页的源代码信息的,这是因为在源代码提取过程中,对方服务器会看到你的请求,发现这是一个爬虫,所以需要添加header代码,让服务器知道这是一个正常的网页请求,具体如下:

定制请求头部

import requests
#添加请求头部,为User-Agent添加新的代理
headers1={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}
#可以添加更多的headers的参数信息例如:connection,Host
#headers1={'Host':'www.baidu.com','User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}
response=requests.get('https://www.baidu.com/',headers=headers1)
re_text=response.text
print(re_text)

在这里插入图片描述
user-Agent的获取方式:
在这里插入图片描述

Part 3:网页图片的下载

3.1 保存网页内容:

with open('bd.text','wt') as f:
    f.write(res.text)

3.2 图片下载:

import requests
#获取图片地址
image_url='https://www.baidu.com/img/PCtm_d9c8750bed0b3c7d089fa7d55720d6cf.png'
#请求获取图片
response=requests.get(image_url)
#保存图片到本地
with open('baidu.png','wb') as f:
    f.write(response.content)

运行结果:
在这里插入图片描述

Part 4 重定向、超时、传递URL参数

重定向:在网页上设置一个约束条件,条件满足就会自动转入其他的网页地址。request会自动处理重定向,因此不需要人为进行过多处理。
追踪重定向r.history

超时:

r=requests.get('https://www.douban.com'.timeout=3)
#对豆瓣网页发起请求,请求在三秒内响应,则不会产生任何错误

传递url参数:

import requests
#在豆瓣书籍栏页面下搜索Python类书籍
r=requests.get('https://www.douban.com/search?',params={'q':'python','cat':'1001'})
#使用param这个参数去传递url参数。
print(r.url)

新的url构造如下:
在这里插入图片描述

Part 5 Urllib库(Python标准库)

urllib库的四个模块

  • Urllib.request 打开和读取URL
  • Urllib.error包含Urllib.request各种错误模块
  • Urllib.parse解析URL
  • Urllib.robotparese解析网站robots.txt文件(robots.txt互联网协议,告诉网站的可爬取内容)

发送GET请求

from urllib.request import urlopen,Request
url='https://www.douban.com'
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}
ret=Request(url,headers=headers)
#urlopen实现对目标url的访问
html=urlopen(ret)
#读取获取的内容
response=html.read()
#读取(豆瓣首页文本代码)
#输出豆瓣首页文本代码。采用response.decode进行解码相当于request中的r.text
print(response.decode('utf-8'))

传递url参数(从豆瓣网的书籍栏搜索Python)

import urllib.request
import urllib.parse
#对参数进行编码
#传递URL参数
payload={'q':'python','cat':'1001'}
reuqest_url='https://www.douban.com/search'
payload_encode=urllib.parse.urlencode(payload)
#构造新的url
url=reuqest_url+'?'+payload_encode
#需要添加头部作为用户代理,否则会被网页的反爬机制退回
headers={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36'}
#构造request的对象
req=urllib.request.Request(url,headers=headers)
#对新的url发起请求
response=urllib.request.urlopen(req)
#读取新的URL,编码最后得到文本响应的内容
print(response.read().decode('utf-8')) 

查看状态码:re.getcode()

提交数据进行处理请求

from urllib import request,parse
#这句代码与import urlib.request import urllib.parse等同
post_data=parse.urlencode([('key1','v1')],[('key2','v2')])
#构造请求对象
url=request.Request('http://httpbin.org/post')
#添加headers
url.add_header('User-Agent','Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36')
response=request.urlopen(url,data=post_data.encode('utf-8')).read()
print(response)

网页拼接

from urllib.parse import urljoin
urljoin('https://accounts.douban.com/','/passport/login?source=main')
#会自行判断是否有重复的'/'或者缺少'/'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值