這是北京理工大學(xué)的課程,附上視頻link:https://www.bilibili.com/video/av9784617/?p=1
?
Requests庫(kù)
Requests庫(kù)主要方法
Requests庫(kù)的7個(gè)主要方法 | |
方法 | 說(shuō)明 |
requests.request() | 構(gòu)造一個(gè)請(qǐng)求,支撐以下各方法的基礎(chǔ)方法 |
requests.get() | 獲取HTML網(wǎng)頁(yè)的主要方法,對(duì)應(yīng)于HTTP的GET |
requests.head() | 獲取HTML網(wǎng)頁(yè)頭信息的方法,對(duì)應(yīng)于HTTP的HEAD |
requests.post() | 向HTML網(wǎng)頁(yè)提交POST請(qǐng)求的方法,對(duì)應(yīng)于HTTP的POST |
requests.put() |
向HTML網(wǎng)頁(yè)提交PUT請(qǐng)求的方法,對(duì)應(yīng)于HTTP的PUT |
requests.patch() | 向HTML網(wǎng)頁(yè)提交局部修改請(qǐng)求,對(duì)應(yīng)于HTTP的PATCH |
requests.delete() | 向HTML頁(yè)面提交刪除請(qǐng)求,對(duì)應(yīng)于HTTP的DELETE |
?
Response對(duì)象的屬性 |
|
屬性 |
說(shuō)明 |
r.status_code |
HTTP請(qǐng)求的返回狀態(tài),200表示連接成功,404表示失敗 |
r.text |
HTTP響應(yīng)內(nèi)容的字符串形式,即url對(duì)應(yīng)的頁(yè)面內(nèi)容 |
r.encoding |
從HTTP header中猜測(cè)的響應(yīng)內(nèi)容編碼方式,如果header中不存在charset,則認(rèn)為編碼為ISO-8859-1 |
r.apparent_encoding |
從內(nèi)容中分析出的響應(yīng)內(nèi)容編碼方式(備選編碼方式) |
r.content |
HTTP響應(yīng)內(nèi)容的二進(jìn)制形式 |
?
理解Requests庫(kù)的異常 |
|
異常 | 說(shuō)明 |
requests.Connection Error | 網(wǎng)絡(luò)連接錯(cuò)誤異常,如DNS查詢失敗、拒絕連接等 |
requests.HTTPError | HTTP錯(cuò)誤異常 |
requests.URLRequired |
URL缺失異常 |
requests.TooManyRedirects | 超過(guò)最大重定向次數(shù), 產(chǎn)生重定向異常 |
requests.ConeetTimeout | 連接遠(yuǎn)程服 務(wù)器超時(shí)異常 |
requests.Timeout | 請(qǐng)求URL超時(shí),產(chǎn)生超時(shí)異常 |
r.raise_for_status() |
如果不是200,產(chǎn)生異常requests.HTTPError |
使用r.raise_for_status()檢查異常,使代碼更健壯
?
爬取網(wǎng)頁(yè)的通用代碼框架
#通用代碼框架框架
def getHTMLText(url):
try:
r = requests.get(url, timeout=30)
r.raise_for_status()
r.encoding = r.apparent_encoding
return r.text
except:
return "error"
if __name__ == "__main__":
url = "http://www.baidu.com"
print getHTMLText(url)
?
HTTP協(xié)議
HTTP, Hypertext Transfer Protocol,超文本傳輸協(xié)議。HTTP是一個(gè)基于“請(qǐng)求與響應(yīng)”模式的、無(wú)狀態(tài)的應(yīng)用層協(xié)議。
URL格式htp://host[:port][path]
host:合法的Internet主機(jī)域名或P地址
port:端口號(hào),缺省端口為80
path:請(qǐng)求資源的路徑
HTTP URL的理解:
url是通過(guò)http協(xié)議存取資源的internet路徑,一個(gè)url對(duì)應(yīng)一個(gè)數(shù)據(jù)資源。
?
?
網(wǎng)絡(luò)爬蟲(chóng)的限制
◆來(lái)源審查:判斷User-Agent進(jìn)行限制
檢查來(lái)訪HTTP協(xié)議頭的User-Agent域, 只響應(yīng)瀏覽器或友好爬蟲(chóng)的訪問(wèn)。
◆發(fā)布公告: Robots協(xié)議
告知所有爬蟲(chóng)網(wǎng)站的爬取策略,要求爬蟲(chóng)遵守。
?
?
Robots協(xié)議
Robots Exclusion Standard網(wǎng)絡(luò)爬蟲(chóng)排除標(biāo)準(zhǔn)
作用:網(wǎng)站告知網(wǎng)絡(luò)爬蟲(chóng)哪些頁(yè)面可以抓取,哪些不行。
形式:在網(wǎng)站根目錄下的robots.txt文件。
在爬取某一個(gè)網(wǎng)站時(shí),可以“網(wǎng)站”+“robots.txt”查看是否限制爬蟲(chóng)
?
案例:京東的Robots協(xié)議
https://www.jd.com/robots.txt
*代表所有? ? ?
user-agent:HuihuiSpider? ? ?Disallow:/? ? ?-->表明針對(duì)user-agent是HuihuiSpider,整個(gè)網(wǎng)站都不可以爬取
?
實(shí)例1:京東商品頁(yè)面的爬取
try:
r = requests.get("https://item.jd.com/100000177760.html")
r.raise_for_status()
r.encoding = r.apparent_encoding
print r.text[:1000]
except:
print "error"
?
實(shí)例2:亞馬遜商品頁(yè)面的爬取
try:
r = requests.get("https://www.amazon.cn/dp/B01NAS120J/ref=cngwdyfloorv2_recs_0/462-8269923-3092529?pf_rd_m=A1AJ19PSB66TGU&pf_rd_s=desktop-2&pf_rd_r=2RAT2AKB28AT2ZBSCDBE&pf_rd_r=2RAT2AKB28AT2ZBSCDBE&pf_rd_t=36701&pf_rd_p=d2aa3428-dc2b-4cfe-bca6-5e3a33f2342e&pf_rd_p=d2aa3428-dc2b-4cfe-bca6-5e3a33f2342e&pf_rd_i=desktop")
r.raise_for_status()
r.encoding = r.apparent_encoding
print r.text[:1000]
except:
print "error"
#對(duì)比傳入headers和不傳入headers的區(qū)別,在第二種可以發(fā)現(xiàn)user-agent改變了
r = requests.get("https://www.amazon.cn/gp/product/B01M8L5Z3Y")
print r.status_code
print r.request.headers
kv = {'user-agent':'Mozilla/5.0'}
r = requests.get("https://www.amazon.cn/gp/product/B01M8L5Z3Y", headers=kv)
print r.request.headers
?
實(shí)例3:百度360搜索關(guān)鍵字提交
#百度關(guān)鍵詞接口
kv = {'wd':'python'}
r = requests.get("http://www.baidu.com/s", params=kv)
print r.request.url
print len(r.text)
#360關(guān)鍵詞接口
kv = {'q':'python'}
r = requests.get("http://www.so.com/s", params=kv)
print r.request.url
print len(r.text)
?
實(shí)例4:網(wǎng)絡(luò)圖片的爬取和存儲(chǔ)
url = "https://www.nationalgeographic.com/animals/2019/04/polar-bears-algae-sea-ice-warming/#/01-polar-bears-algae-nationalgeographic_675501.jpg"
root = './pics/'
path = root + url.split('/')[-1]
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r = requests.get(url)
with open(path, 'wb') as f:
f.write(r.content)
f.close()
print '文件保存成功'
else:
print '文件已存在'
except:
print '爬取失敗'
?
實(shí)例5:ip地址歸屬地的自動(dòng)查詢
url = 'http://m.ip138.com/ip.asp?ip='
try:
r = requests.get(url + '202.204.80.112')
r.raise_for_status()
r.encoding = r.apparent_encoding
print r.text[-500:]
except:
print '爬取失敗'
?
更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主
微信掃碼或搜索:z360901061

微信掃一掃加我為好友
QQ號(hào)聯(lián)系: 360901061
您的支持是博主寫(xiě)作最大的動(dòng)力,如果您喜歡我的文章,感覺(jué)我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。
【本文對(duì)您有幫助就好】元
