使用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 requests

url = xxx

payload = {some: data}

r = requests.post(url, data=json.dumps(payload))

print r.text

Cookies

如果一個響應中包含了cookie,那麼我們可以利用 cookies 變數來拿到

import requests

url = http://example.com

r = requests.get(url)

print r.cookies

print r.cookies[example_cookie_name]

超時配置

可以利用 timeout 變數來配置最大請求時間

requests.get(github.com, timeout=0.001)

註:timeout 僅對連接過程有效,與響應體的下載無關

Sessions

如果我們要打開多個URL,也就是我們每次發新的請求,使用不同瀏覽器打開,後面的無法獲取cookies。

如果要保持一個持久會話怎麼辦呢?

解決方案如下

import requests

s = requests.Session()

s.get(xxx/login)

r = s.get("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(kyfw.12306.cn/otn/, verify=False)

print r.text

Proxy

如果需要使用代理,你可以通過為任意請求方法提供 proxies 參數來配置單個請求。

因為很多網站都有反爬措施,限制IP。一般都會考慮用ip池來爬。

import requests

proxies = {

"https": "xxx"

}

r = requests.post("yyy", proxies=proxies)

print r.text

好了,掌握了這些知識,就可以開幹了。我們以爬取testerhome的topic為例,看每天大家都在關注什麼。

這裡用requests+beautifulsoup來實現,beautifulsoup主要是用來定位坐標,以後會講。

首先,用瀏覽器的開發者工具,打開看看我們請求需要傳什麼參數(當然這裡不用登陸也可以爬取,但是大多數還是需要登陸的)

定位到我們需要定位的元素:

寫代碼執行,效果是這樣的:

很簡單吧!我這裡只是簡單把數據給抓取了,沒有寫入excel,或者資料庫。也沒有去分析和展示出來。

當然你有精力,可以進一步加工。用詞雲展現出來。

今天終於開始爬蟲了。有些關注者在後台留言,說要搞個爬蟲專題,一看我沒寫,立馬取關。我現在開始了,可惜你看不到了。

代碼奉上:

import requests

from bs4 import BeautifulSoup

import re

s = requests.Session()

username = "安蜀黍"

password = "snake"

login_url = "testerhome.com/account/"

search_url= "testerhome.com/topics/l"

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個第三方應用

TAG:Python | python爬蟲 | 網頁爬蟲 |