使用requests+beautifulsoup爬取你想要的數據
在當今大數據時代,數據是比較值錢的東西。很多數據是你拿不到的,要靠自己收集。有一種方法叫爬蟲,就是通過爬取網頁內容,獲得想要的數據。
我們爬取數據能幹什麼。這就看你的需求。比如有人可以爬網站,下載資源(電影,歌曲,文檔,書籍等)
有人可以爬取網站,獲取資訊,如爬股票網站,獲取股票歷史數據;為自己的投資做參考。
爬取招聘網站,可以了解工作機會。 爬取房產網站,獲取房價走勢,決定出手時機。 爬取行業網站,可以獲取行業動態。。。甚至可以爬取娛樂信息,自動發到自己郵箱,或者微信上,圖個開心。
一般我們可以爬取海量數據,通過整理,分析,用圖形化展現出來。
在爬取的過程中,可能遇到各種問題,於是就出現了分散式爬蟲,爬蟲框架,反扒蟲等等。本文這裡不搞那麼複雜,就是簡單用python的一個requests庫來實現爬蟲。
Requests是一個基於Apache2協議開源的Python HTTP庫,號稱是「為人類準備的HTTP庫」。
Python中,系統自帶的urllib和urllib2都提供了功能強大的HTTP支持,但是API介面確實太難用了。requests作為更高一層的封裝,用起來簡單快捷。
首先得安裝:利用 pip 安裝pip install requests
先看看幾個常用的方法和屬性:
1.requests.Session()這樣就可以在會話中保留狀態,保持cookie等
2.requests.get()獲取某個網頁
3.requests.post()發送post請求,類似的,post時也可以發送數據(使用data參數)和定製請求頭(使用headers參數)。
一些常用的屬性:
result=requests.post(url,data,headers)
result.text #可以獲取響應的內容如抓回來的網頁result. encoding=utf-8 #有時回來的是亂碼,改變編碼以使其正常顯示根據實際情況改變編碼utf-8、gb2312等result. content #可以獲取二進位內容,如抓取登陸時的驗證碼等非字元資源result.cookies #可以查看當前保存的cookie情況result. status_code #可以查看HTTP狀態碼(如200 OK、404 Not Found等)result.url #可以查看當前請求的網址</pre> 有時候我們需要傳送的信息不是表單形式的,需要我們傳JSON格式的數據過去,所以我們可以用 json.dumps() 方法把表單數據序列化。
import json
import requestsurl = http://xxxpayload = {some: data}r = requests.post(url, data=json.dumps(payload))print r.textCookies
如果一個響應中包含了cookie,那麼我們可以利用 cookies 變數來拿到
import requests
url = http://example.comr = requests.get(url)print r.cookies
print r.cookies[example_cookie_name]超時配置
可以利用 timeout 變數來配置最大請求時間
requests.get(http://github.com, timeout=0.001)
註:timeout 僅對連接過程有效,與響應體的下載無關
Sessions
如果我們要打開多個URL,也就是我們每次發新的請求,使用不同瀏覽器打開,後面的無法獲取cookies。如果要保持一個持久會話怎麼辦呢?解決方案如下import requests
s = requests.Session()s.get(http://xxx/login)
r = s.get("http://xxx/home")print(r.text)` 相當於有個全局變數,第一個的cookies存到了全局變數裡面,後面的直接拿來用就可以了。
SSL證書驗證
現在隨處可見 https 開頭的網站,Requests可以為HTTPS請求驗證SSL證書,就像web瀏覽器一樣。要想檢查某個主機的SSL證書,你可以使用 verify 參數。
如果你不想驗證,只要設置為False即可,否則會爆如下錯誤:requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)
解決方案:
import requests
r = requests.get(https://kyfw.12306.cn/otn/, verify=False)print r.text
Proxy
如果需要使用代理,你可以通過為任意請求方法提供 proxies 參數來配置單個請求。
因為很多網站都有反爬措施,限制IP。一般都會考慮用ip池來爬。import requests
proxies = { "https": "http://xxx"}r = requests.post("http://yyy", proxies=proxies)print r.text 好了,掌握了這些知識,就可以開幹了。我們以爬取testerhome的topic為例,看每天大家都在關注什麼。
這裡用requests+beautifulsoup來實現,beautifulsoup主要是用來定位坐標,以後會講。
首先,用瀏覽器的開發者工具,打開看看我們請求需要傳什麼參數(當然這裡不用登陸也可以爬取,但是大多數還是需要登陸的)
定位到我們需要定位的元素:
寫代碼執行,效果是這樣的:
很簡單吧!我這裡只是簡單把數據給抓取了,沒有寫入excel,或者資料庫。也沒有去分析和展示出來。
當然你有精力,可以進一步加工。用詞雲展現出來。今天終於開始爬蟲了。有些關注者在後台留言,說要搞個爬蟲專題,一看我沒寫,立馬取關。我現在開始了,可惜你看不到了。
代碼奉上:
import requests
from bs4 import BeautifulSoupimport res = requests.Session()username = "安蜀黍"password = "snake"login_url = "https://testerhome.com/account/sign_in"search_url= "https://testerhome.com/topics/last"result = s.post(url=login_url,data={"user[login]":username,"user[password]":password,"commit":"登陸"})print(result.status_code)print(result.cookies)
page = s.get(search_url)# soup = BeautifulSoup(page.content, html5lib)soup = BeautifulSoup(page.content, lxml)target = soup.select(div.title.media-heading a)for title in target: find_result = re.search(rtitle="(.*?)",str(title)) if find_result !=None: print(find_result.group(1))更多精彩,請關注微信公眾號: python 愛好部落
推薦閱讀:
※爆款遊戲《貪吃蛇大作戰》的 Python 實現
※[Python] Marvel和DC哪個更政治正確
※如何學習Python?
※PyQt5系列教程(10):老闆,這個打一下
※Django開發社交類網站必備的10個第三方應用