Requests是python的一個HTTP客戶端庫,幾乎能夠解決咱們遇到的任何爬蟲問題,其強大簡潔的API足以讓人體會到python的優雅。html
Windows下安裝經過python
pip install requests
以後能夠在CMD下運行 pythonjson
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 有兩種方式:基本使用示例網站
# 解析if __name__ == '__main__': main()# 通俗的理解__name__ == '__main__':假如你叫小明.py,在朋友眼中,你是小明(__name__ == '小明');# 在你本身眼中,你是你本身(__name__ == '__main__')。
# if __name__ == '__main__'的意思是:當.py文件被直接運行時,if __name__ == '__main__'之下的代碼塊將被運行;當.py文件以模塊形式被導入時,if __name__ == '__main__'之下的代碼塊不被運行。
優勢:
兩種方法均可以,實際開發中建議第一種,由於更加簡潔優雅,體現了python的語法。
也就是:
方便傳輸參數
方便維護
方便調試
耦合性低,模塊化
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
須要注意的是,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 使用示例二
請求json數據
以前有不少小夥伴問我,如何抓取騰訊新聞,那麼我今天要告訴你,它來了:
# -*- 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 一個
注意,這裏爬取的百度圖片是 Ajax 因此圖片獲取和你實際頁面看的不同。
上面的也是QQ新聞的,簡單爬蟲。
那百度圖片呢?
由於,我是分開寫的。很差都顯示出來,您能夠經過如下方式獲取完整代碼
1,公衆號後臺回覆:baidu_img
2,點擊我朋友圈裏的相關代碼連接
2
.構建複雜請求
requests.get():
是單個獨立的,服務器認爲是兩個不一樣的人訪問的。
這樣就會出現許多的樣板代碼,就相似於每次get都須要加headers
忽略HTTPS證書驗證
ip代理
3 上傳與下載上傳文件
file:文件名稱(固定的)
render:起個名字而後打開
application/html:文件格式(html 換成txt等)
Expires:過時時間
文件下載:
4
# 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=©right=&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=©right=&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('咱們要翻譯的漢字')