03 | Python爬蟲庫

Requests是python的一個HTTP客戶端庫,幾乎能夠解決咱們遇到的任何爬蟲問題,其強大簡潔的API足以讓人體會到python的優雅。html

Windows下安裝經過python

  •  
pip install requests

 

以後能夠在CMD下運行 pythonjson

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


 

 

2. 要使用requests,首先推薦閱讀requests的官方文檔
  •  
https://2.python-requests.org//zh_CN/latest/user/quickstart.html

 

HTTP請求中咱們一般只會用GET和POST,requests對於區分了兩種不一樣的請求方式。分別是帶參數和不帶參數,下邊給出實例:服務器

不帶參數cookie

  •  
https://www.baidu.com

 

帶參數app

  •  
https://www.baidu.com/s?wd=python

 

判斷URL是否帶有參數,能夠經過對符號?的判斷。通常網站URL後邊帶有?說明帶有參數,參數的規則以下dom

1)?後接參數ide

2)參數之間用&鏈接模塊化

Requests 實現 GET 請求,對可帶參數的 URL 有兩種方式:基本使用示例網站

3. 基本使用示例:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

  •  
# 解析if __name__ == '__main__':    main()# 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');# 在你本身眼中,你是你本身(__name__ == '__main__')。
# if __name__ == '__main__'的意思是:當.py文件被直接運行時,if __name__ == '__main__'之下的代碼塊將被運行;當.py文件以模塊形式被導入時,if __name__ == '__main__'之下的代碼塊不被運行。
參數

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

方法二:(更推薦下圖方法二,也就是上圖方法)

優勢:

兩種方法均可以,實際開發中建議第一種,由於更加簡潔優雅,體現了python的語法。

也就是:

  • 方便傳輸參數

  • 方便維護

  • 方便調試

  • 耦合性低,模塊化

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

那多個參數怎麼傳呢?
  •  
import requests
url = 'https://www.baidu.com'
params = {'wd':'python', 'pn': 'C#'}response = requests.get(url, params = params)print(response.url)
# 輸出https://www.baidu.com/?wd=python&pn=C%23

 

4. POST方法就是咱們平常生活中提交表單的方法,好比登陸驗證之類的。Requests實現的POST須要傳遞參數data,可使字典或者json結構,或者元組,列表等。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

須要注意的是,GET請求傳遞的是params,POST傳遞的是data,不能混淆兩者。

此外,服務器返回的信息裏包含了許多咱們須要的數據,好比

Html.status_code 相應狀態碼
Html.raw 原始響應體
Html.content 字節響應體,須要解碼
Html.text 字符串的響應方式
Html.headers 服務器響應頭
Html.josn() requests內置的json解碼器
Html.cookies 獲取請求後的cookies
Html.encoding 獲取編碼格式

 

Post 使用示例二

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=


    

請求json數據

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

以前有不少小夥伴問我,如何抓取騰訊新聞,那麼我今天要告訴你,它來了:

  •  
# -*- coding: utf-8 -*-# @Author     :AI悅創# @DateTime   :2019/9/14  16:10 # @FileName   :newsqq_title.PY# @Function   :功能# Development_tool   :PyCharm# <-------import data-------------->import requests
url = 'https://news.qq.com/ext2020/apub/json/prevent.new.json'html = requests.get(url)
base_url = 'https://new.qq.com/omn/20190913/'if html.status_code == 200: for title in html.json(): print(title['id'], title['title'],'詳情頁網址:>', base_url + title['id']) # 詳情頁的數據就再進一步請求便可 # 輸出"C:\Program Files\Python37\python.exe" D:/daima/pycharm_daima/爬蟲大師班/newsqq_title.py20190724V0BAZH 河北懷來氣體中毒事故續:5人因救人中毒 進現場2分鐘就暈倒 詳情頁網址:> https://new.qq.com/omn/20190913/20190724V0BAZH20190723A0RQDR 廣西桂林一景區女浴室內裝攝像頭,16名女遊客報警維權 詳情頁網址:> https://new.qq.com/omn/20190913/20190723A0RQDR20190724V0WL4T 緊急呼叫丨湖南男子稱被警察打傷續 拉架者:無端被打望道歉賠償 詳情頁網址:> https://new.qq.com/omn/20190913/20190724V0WL4T20190727A06E37 山西一刑釋人員控制「村兩委」:帶打手到醫院砍人,打斷村民四肢 詳情頁網址:> 中間大部分省略。。。。。。https://new.qq.com/omn/20190913/20190727A06E37https://new.qq.com/omn/20190913/20190913V006UZ20190913V049GN 「你剛舉報我了?」記者舉報非法生產 10分鐘後神祕人打來電話 詳情頁網址:> https://new.qq.com/omn/20190913/20190913V049GN20190912A0QQJT 廣州一24歲女教師在校內離奇死亡 去世前一天還給家裏轉帳 詳情頁網址:> https://new.qq.com/omn/20190913/20190912A0QQJT20190912A0R6DY 華中科技大學研究生跳樓身亡 校方:中止導師研究生招生資格兩年 詳情頁網址:> https://new.qq.com/omn/20190913/20190912A0R6DY20190913V00KE3 深圳一小區高空鋸樹砸死路過老人:事發時正帶着小孩散步 詳情頁網址:> https://new.qq.com/omn/20190913/20190913V00KE3
進程已結束,退出代碼 0

我們今天寫個小爬蟲,百度圖片:

 

咱們能夠發現是以30爲基準的,每30 一個

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

注意,這裏爬取的百度圖片是 Ajax 因此圖片獲取和你實際頁面看的不同。

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

上面的也是QQ新聞的,簡單爬蟲。

那百度圖片呢?

由於,我是分開寫的。很差都顯示出來,您能夠經過如下方式獲取完整代碼

1,公衆號後臺回覆:baidu_img

2,點擊我朋友圈裏的相關代碼連接

接下來,下載音視頻

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

2

.構建複雜請求

 

維持會話:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

requests.get():

是單個獨立的,服務器認爲是兩個不一樣的人訪問的。

這樣就會出現許多的樣板代碼,就相似於每次get都須要加headers

Session 的好處

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

忽略HTTPS證書驗證

 

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

ip代理

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

 

3  上傳與下載上傳文件

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

file:文件名稱(固定的)

render:起個名字而後打開

application/html:文件格式(html 換成txt等)

Expires:過時時間

文件下載:

watermark,size_16,text_QDUxQ1RP5Y2a5a6i,color_FFFFFF,t_100,g_se,x_10,y_10,shadow_90,type_ZmFuZ3poZW5naGVpdGk=

 

 
Urllib 補充
  •  
# Urllib 經常使用 API
1. urllib.parse.urljoin2. urllib.parse.quote3. urllib.parse.urlsplit4. urllib.parse.urlparse
1. urllib.parse.urljoinfrom urllib import parse
domain = 'https://bilbil/com/'url = '/img_1234'res = domain + urlprint('不使用庫:>>>', res)res = parse.urljoin(domain, url)print('使用urllib:>>>', res)
# 輸出不使用庫:>>> https://bilbil/com//img_1234使用urllib:>>> https://bilbil/img_1234[Finished in 0.2s]

2. urllib.parse.quotefrom urllib import parse
text = 'http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=%E5%A3%81%E7%BA%B8&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word=%E5%A3%81%E7%BA%B8&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&cg=wallpaper&pn=60&rn=30&gsm=&1568645521643='unquote = parse.unquote(text)print(unquote,'\n\n')
quote = parse.quote(text)print(quote)
# 輸出http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result&queryWord=壁紙&cl=2&lm=-1&ie=utf-8&oe=utf-8&adpicid=&st=-1&z=&ic=0&hd=&latest=&copyright=&word=壁紙&s=&se=&tab=&width=&height=&face=0&istype=2&qc=&nc=1&fr=&expermode=&force=&cg=wallpaper&pn=60&rn=30&gsm=&1568645521643=

http%3A//image.baidu.com/search/acjson%3Ftn%3Dresultjson_com%26ipn%3Drj%26ct%3D201326592%26is%3D%26fp%3Dresult%26queryWord%3D%25E5%25A3%2581%25E7%25BA%25B8%26cl%3D2%26lm%3D-1%26ie%3Dutf-8%26oe%3Dutf-8%26adpicid%3D%26st%3D-1%26z%3D%26ic%3D0%26hd%3D%26latest%3D%26copyright%3D%26word%3D%25E5%25A3%2581%25E7%25BA%25B8%26s%3D%26se%3D%26tab%3D%26width%3D%26height%3D%26face%3D0%26istype%3D2%26qc%3D%26nc%3D1%26fr%3D%26expermode%3D%26force%3D%26cg%3Dwallpaper%26pn%3D60%26rn%3D30%26gsm%3D%261568645521643%3D[Finished in 0.2s]
3. urllib.parse.urlsplit4. urllib.parse.urlparse
from urllib import parse
url = 'http://image.baidu.com/search/acjson?tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result'print(parse.urlsplit(url)) # 分割# print(quote == text)print(parse.urlparse(url)) # 解析(高級一些)
# 輸出SplitResult(scheme='http', netloc='image.baidu.com', path='/search/acjson', query='tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result', fragment='')ParseResult(scheme='http', netloc='image.baidu.com', path='/search/acjson', params='', query='tn=resultjson_com&ipn=rj&ct=201326592&is=&fp=result', fragment='')[Finished in 0.2s]

拓展:

  •  
url='&rsv_sug7=001&rsv_n=2&rsv_sug2=0&prefixsug=https%253A%252F%252Fwww.raspberrypi.org%252Fdownloads%252F&rsp=6&rsv_sug9=es_0_1&inputT=1489&rsv_sug4=1502&rsv_sug=9'

 

如上url,咱們可能會對百分號後的內容產生疑問而unquote的做用就是翻譯它們的,(url內容變咱們所能理解的語言)quote(將咱們的語言轉換成相似內容)如下是代碼:

 

  •  
from urllib import parseprint(parse.unquote('咱們要翻譯的url中%後的內容'))print(parse.quote('咱們要翻譯的漢字')
相關文章
相關標籤/搜索