目录
1.1使用get()函数可以发送不携带url参数和携带url参数的GET请求
一、urllib库
1、了解什么是urllib库
urllib库是python内置的HTTP请求库,它可以看作是处理URL的组件集合
以下是常用模块名称及作用:
2、快速使用urllib爬取网页
import urllib.request
#调用urllib.request库的urlopen()方法,并传入一个url,即目标网站
response=urllib.request.urlopen('http://www.baidu.com')
#使用read方法读取获取到的网页内容
html=response.read().decode('Utf-8')
#打印网页内容
print(html)
上述仅仅用几行代码就已经帮我们把百度的首页代码下载下来了。实际上,如果我们在浏览器上打开百度主页,右键“查看源代码”,你会发现,跟我们打印出来的是一模一样。
爬取网页时,有一句核心的爬虫代码:response=urllib.request.urlopen('http://www.baidu.com')
这句代码调用的是urllib.request模块中的urlopen方法,它传入了一个百度首页的URL,使用的协议是HTTP,这是urlopen方法最简单的用法
以下是urlopen()方法的语法格式和具体含义,在使用urlopen方法的时候,需要传递很多的参数,实事上大多数时候只需要关注前面的url、data、timeout这3个参数就行。
(1)url:String类型的地址,也就是我们要访问的URL。
(2)data:参数指的是在请求的时候,需要提交的数据。
(3)timeout:参数用于设置请求超时的时间,单位是秒
(4)cafile和capath:代表CA证书和CA证书的路径,如果使用HTTPS,则需要用到。
(5)context:用来指定SSL设置,必须是ssl.SSLContext类型。
3、设置代理服务器
设置代理服务器的作用是:每隔一段时间换一个代理,如果某个IP被禁止,那么就可以换成其他IP继续爬取数据,从而可以有效解决被网站禁止访问的情况。
urlopen不支持代理、Cookie等其他的HTTP/HTTPS高级功能,所以如果要想设置代理,不能使用自带的urlopen,而是要自定义openr。我们可以使用urllib.request中的ProxyHandler方法来设置代理服务器。
import urllib.request
# 设置代理IP
proxy_ip = "http://www.xicidaili.com/nt/"
# 构造代理处理器对象
proxy_handler = urllib.request.ProxyHandler({"http": proxy_ip})
# 构造一个自定义的opener对象
opener = urllib.request.build_opener(proxy_handler)
# 使用自定义的opener对象发起访问请求response
pro= opener.open("http://www.baidu.com")
# 打印请求结果
print(pro.read().decode("utf-8"))
print(pro.getcode())
免费代理网站主要有一下几个:
- 西刺免费代理IP
- Proxy360代理
- 快代理免费代理
- 全网代理IP
4、超时设置
我们可以为HTTP请求设置超时时间,一旦超过这个时间,服务器还没有返回响应内容,就会抛出一个超时异常。
import requests
#设置超时时间
r = requests.get("https://www.taobao.com",timeout=1)
print(r.status_code)
5、实践项目urllib库--某官网图片批量提取
import re
import urllib.request
from os import path
response = urllib.request.urlopen('目标子网站')
html = response.read().decode('UTF-8')
imgs = re.findall(r'<img.*src=\"(.+?(jpg))', html)
print(imgs)
for index,(img, pic) in enumerate(imgs):
img = '目标网站' + img
print(img)
res_img = urllib.request.urlopen(img)
tupian = res_img.read()
filename = path.basename(img)
with open("保存的位置" + filename, "bw") as f:
f.write(tupian)
print(f"第{index + 1}张图片下载成功")
运行结果会在你指定的位置打印照片即:
二、requests库
1、发送基本请求
在Requests库中,GET 请求通过调用get()函数发送,该函数会根据传入的URL构建一个请求(每个请求都是Request类对象),将该请求发送给服务器。get()函数声明如下:
get(url,params=None,headers=None,cookies=None,verify=True,proxies=None,timeout=None,**kwargs)
url:必选参数,表示请求的URL。
params:可选参数,表示请求的查询字符串。
headers:可选参数,表示请求的请求头,该参数只支持字典类型的值。
cookies:可选参数,表示请求的Cookie信息,该参数支持字典或CookiJar类对象。
verify:可选参数,表示是否启用SSL证书,默认值为True。
proxies:可选参数,,用于设置代理服务器,该参数只支持字典类型的值。
timeout:可选参数,表示请求网页时设定的超时时长,以秒为单位。
1.1使用get()函数可以发送不携带url参数和携带url参数的GET请求
不携带url参数的GET请求:
import requests
#准备URL
base_url='https://www.baidu.com/'
#根据URL构造请求发送GET请求,接收服务器返回的响应信息
response=requests.get(url=base_url)
#查看响应码
print(response.status_code)
携带url参数的GET请求:
import requests
base_url='https://www.baidu.com/'
param='wd=python'
full_url=base_url+'?'+param#拼接完整的URL
#根据URL构造请求,发送GET请求,接收服务器返回响应信息
response=requests.get(full_url)
##查看响应码
print(response.status_code)
1.2处理响应
为了保证获取的源代码中能够正常显示中文,这里需要通过Response对象的encoding属性将编码格式设置为UTF-8。
import requests
base_url='https://www.baidu.com/'
#根据URL构造请求,发送GET请求,接收服务器返回响应信息
response=requests.get(base_url)
#设置响应内容的编码格式
response.encoding='utf-8'
#查看响应内容
print(response.text)
2、处理复杂请求
2.1定制请求头
在requests中,设置请求头的方式非常简单,只需要在调用请求函数时为headers参数传入定制好的请求头即可,一般是将请求头中的字段与值分别作为字典的键的值,以字典的形式传给headers参数。
header={'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'}
2.2验证Cookie
Cookie(有时也用其复数形式Cookies)是指某些网站为了分辨用户身份、进行会话跟踪,而暂时存储在用户端的一段文本数据(通常经过加密)。Cookies参数需要接收一个RequestsCookieJar类的对象,该对象类似一个字典,它会以名称(Name)与值(Value)的形式存储Cookie。
发送请求方式一:
import requests
headers={
'Cookie':'此处填写登录百度网站后查看的Cookie信息',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'
}
response=requests.get('http://tieba.baidu.com/',headers=headers)
print(response.text)
发送请求方式二:
import requests
header={
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/119.0.0.0 Safari/537.36 Edg/119.0.0.0'
}
cookie:'此处填写登录百度网站后查看的Cookie信息'
#创建RequestsCookieJar类对象
jar_obj=requests.cookies.RequestsCookieJar()
#以逗号为分隔符分割cookie,并将获得的键和值保存在jar_obj中
for temp in cookie.split(';'):
key,value=temp.split('=',1)
jar_obj.set(key,value)
response=requests.get('http://www.baidu.com/',headers=header,cookies=jar_obj)
print(response.text)
3、实践项目:爬取百度贴吧的传智播客
import urllib.request
import urllib.parse
def tieba_spider(url, begin_page, end_page):
for page in range(begin_page, end_page+1):
pn=(page-1)*50
file_name="第"+str(page)+"页.html"
full_url=url+"&pn="+str(pn)
html=load_page(full_url,file_name)
write_page(html,file_name)
def load_page(url,filename):
headers={"User-Agent":"Mozilla/5.0 (compatible; MSIE 9.0 Windows NT 6.1; Trident/5.0;)"}
request =urllib.request.Request(url, headers=headers)
return urllib.request.urlopen(request).read()
def write_page(html,filename):
print("正在保存"+filename)
with open(filename,'w',encoding='utf-8') as file:
file.write(html.decode('utf-8'))
if __name__=="__main__":
kw=input("请输入需要抓取的贴吧名:")
begin_page=int(input("请输入起始页:"))
end_page=int(input("请输入结束页:"))
url='http://tieba.baidu.com/f?'
key=urllib.parse.urlencode({"kw":kw})
url=url+key
tieba_spider(url, begin_page, end_page)
运行结果如下: