request库的基本使用方法,不多bb,上代码,需要注意的地方都在注释里了
import requests
from bs4 import BeautifulSoup
def get_html_text(url):
try:
r=requests.get(url,timeout=50)#返回的r是Response类的对象,超过50s时抛出Timeout异常
r.raise_for_status()#自动检查status_code是不是200,不是就抛出HTTPError异常
#print(r.status_code)#status_code状态码是200才是返回成功,不是200就是失败
#print(r.encoding)#看看编码方式
#print(r.apparent_encoding)#备用编码
r.encoding=r.apparent_encoding#使用当前encoding的值不能正确解码时,则用apparent_encoding的值替换encoding
#print(r.text)
#print(r.headers)
return r.text
except requests.HTTPError as http_error:
return "HTTPError"
except requests.Timeout:
return "Timeout"
'''
Response对象包含了返回的网页的所有内容
Request对象是Response对象的一个属性
Response类属性:
r.status_code==200,访问成功
r.text,返回页面的字符串形式
r.encoding页面编码方式,若header中存在charset字段,get()方法执行后其编码方式自动保存在r.encoding中
若header无该字段,r.encoding自动设置为默认值ISO-8859-1
r.apparent_encoding是Request库提供的备选编码
get()方法执行时会分析页面内容推测其编码方式并将分析结果存放在r.apparent_encoding中,因此apparent_encoding中存放的往往是页面真正的编码方式
r.conten返回页面的二进制形式,如获取图片
'''
'''
使用Response对象r的基本流程:
r=requests.get(url,par)
r.status_code(检查状态码?=200)
r.encoding/r.text/r.apparent_encoding/r.content
'''
'''
requests库异常:
requests.ConnectionError
requests.HTTPError
requests.URLRequired
requests.Timeout
Response类提供了raise_for_status()方法供检查r.status_code是不是200,
不是就抛出HTTPError
'''
'''
requests库的7个主要方法:
!!!requests.get()获取HTML网页
!!!requests.head()获取HTTP头信息
requests.post()向HTML网页提交post请求,附加新数据
requests.put()向HTML网页提交put请求,覆盖原资源
requests.patch()向HTML网页提交修改请求,局部修改该资源
requests.delete()向HTML网页提交删除请求,删除该url资源
'''
'''
13个访问控制参数:
详见:
!!!params=字典或者字符串a,将a作为参数添加到get()的原url中
!!!headers:字典,HTTP请求头,作为Request对象Header的内容
!!!data:字典、字节序列,文件,作为Request对象body的内容
json:JSON格式的数据,作为Request对象body的内容
files:字典,形式为{filename: fileobject},表示要上传的文件
timeout设定超时时间
proxies设置代理服务器
headerValue={'user-agent': 'Chrome/10'}
r=requests.request('POST','http://www.baidu.com',headers=headerValue)
伪装爬虫
dict={'key1':1,"key2":2}
r=requests.post(my_url,data=dict)#附加新数据
r=requests.put(my_url,data=dict)
'''
def get_jjingdong_html(url):#通过控制参数设置内部对象request的headers,爬虫伪装
try:
kv={"user-agent":"Mozilla/5.0"}#爬虫伪装
r=requests.get(url,headers=kv,timeout=50)#设置Request对象的Header里的user-agent字段的值
r.raise_for_status()
if r.encoding=="ISO-8859-1":#设置编码可读
r.encoding=r.apparent_encoding
#print(r.request.headers)
#print(r.headers)
#print(requests.head(url,headers=kv,timeout=50).headers)
'''
注意r.request.headers获得的是执行get方法时内部生成的Request对象的header,用控制参数可设置其值
r.headers获得的是get方法执行后响应的header,其结果同requests.head(url).headers
另外HTML网页<head>标签内容只能通过r.text获取,和HTTP header不是一个概念
'''
return r.text[:100]
except requests.HTTPError as http_error:
return "HTTPError"
def get_baidu_keyword():#设置百度搜索关键字,往url添加参数例子
try:
kv={"user-agent":"Mozilla/5.0"}#爬虫伪装
dict_kw={"wd":"Python Java"}#设置关键字
r=requests.get("http://www.baidu.com/s",params=dict_kw,headers=kv,timeout=50)
r.raise_for_status()
if r.encoding=="ISO-8859-1":#设置编码可读
r.encoding=r.apparent_encoding
print(r.request.url)
#print(len(r.text))
except requests.HTTPError:
print("HTTPError")
def get_picture():#爬指定url的图片
path="D:\Pictures\\s.jpg"
url3="https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1577101458513&di=492d3eeed207aa63d85bd7737de67c3f&imgtype=0&src=http%3A%2F%2Fwww.hscbw.com%2Fupfile%2F140709%2F1404886487138811.jpg"
try:
kv={"user-agent":"Mozilla/5.0"}#爬虫伪装
r=requests.get(url3,headers=kv,timeout=50)
r.raise_for_status()
if r.encoding=="ISO-8859-1":#设置编码可读
r.encoding=r.apparent_encoding
with open(path,'wb') as fi:#图片是二进制文件
fi.write(r.content)#写入二进制文件
fi.close()
except requests.HTTPError:
print( "HTTPError")
def try_beautifulsoup():#测试BeautifulSoup
try:
r = requests.get("https://www.baidu.com", timeout=50)
r.raise_for_status()
r.encoding = r.apparent_encoding
bs_demo=r.text
soup=BeautifulSoup(bs_demo,"html.parser")
print(soup.prettify())
except requests.HTTPError as http_error:
print( "HTTPError")
if __name__=="__main__":
url1="https://www.baidu.com"
get_html_text(url1)
url2 = "https://www.bilibili.com/blackboard/activity-shihuakoupc.html"
get_jjingdong_html(url2)
get_baidu_keyword()
get_picture()
try_beautifulsoup()