天天看點

python豆瓣的簡單爬蟲

https://movie.douban.com/

直奔主題,給個要爬取的豆瓣電影位址,爬取熱門電影名字。

python豆瓣的簡單爬蟲

右鍵選擇檢視網頁源碼,我們可以發現在網頁靜态源碼裡,是找不到‘來電狂想’這些關鍵字的。

python豆瓣的簡單爬蟲

通過檢查網頁,檢視network下的XHR,我們可以找到對應的資訊。說明我們想要爬取的這部分内容是通過Ajax從背景拿到的json資料。

python豆瓣的簡單爬蟲

copy link address得到通路的url:https://movie.douban.com/j/search_subjects?type=movie&tag=%E7%83%AD%E9%97%A8&page_limit=50&page_start=0

分析url,傳入的參數:

{\'type\': \'movie\', \'tag\': \'熱門\', \'page_limit\': 50, \'page_start\': 0}  # 資料類型是電影,标簽是熱門,傳回資料總數50條,資料起始位置第0條      

于是我們就可以寫個腳本,将0-50條json資料裡title字段的值(熱門電影的名字)爬取下來。

from urllib.parse import urlencode
from urllib.request import urlopen, Request
import simplejson
import ssl

# 僞裝成浏覽器
ua = \'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_14_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36\'
base_url = \'https://movie.douban.com/j/search_subjects\'
d = {
    \'type\': \'movie\',
    \'tag\': \'熱門\',
    \'page_limit\': 50,
    \'page_start\': 0
}

# ssl驗證問題:忽略不信任的證書。就可以通路該網站
context = ssl._create_unverified_context()

# url編碼後,傳入Request()函數;headers參數僞裝浏覽器
req = Request(\'{}?{}\'.format(base_url, urlencode(d)), headers={\'User-agent\': ua})

with urlopen(req, context=context) as res:
    res = simplejson.loads(res.read())  # json轉dict

    for subject in res[\'subjects\']:
        print(subject[\'title\'])  # 取出電影名字
        with open(\'douban.txt\', \'a\') as f:
            f.write(subject[\'title\'] + \'\n\')      

部分結果:

小偷家族
蜘蛛俠:平行宇宙
三次元女友
悠哉日常大王劇場版:假期活動
獨家記憶番外之相信愛
波西米亞狂想曲
白蛇:緣起
誰先愛上他的
“大”人物
無敵破壞王2:大鬧網際網路
來電狂響
神奇動物:格林德沃之罪
無名之輩
毒液:緻命守護者      

寫到這裡還有一個小知識點想記錄一下。就是爬蟲中最常見遇到的有SSL導緻的‘urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:833)’錯誤。

其實也就是https的問題:

HTTP(HyperText Transfer Protocol)超文本傳輸協定是浏覽器和伺服器之間傳遞資訊的一種協定。HTTP以明文的方式發送資訊,不進行任何的加密。是以如果攻擊者截取了浏覽器和伺服器之間的封包,就可以直接獲得其中的資訊,如果裡面包含了使用者名、密碼、銀行卡号等敏感資訊就很不安全了。

HTTPS(Hypertext Transfer Protocol Secure)超文本傳輸安全協定在HTTP基礎上加入了SSL(Secure Sockets Layer)協定建構的可進行加密傳輸、身份驗證的網絡協定,來保證資料的安全。

HTTPS通過兩種方法保證資料安全:

1.建立一個資訊安全通道,來保證資料傳輸的安全

2.确認網站的真實性

https http
需要CA(Cerfificate Authority)申請證書,需要一定費用 不需要CA憑證
ssl加密傳輸 資訊是明文傳輸
連接配接端口:443 連接配接端口:80

https工作原理:

1.用戶端發起HTTPS請求(浏覽器輸入一個https網址,連接配接到伺服器的443端口);

2.伺服器端的配置(采用HTTPS協定的伺服器必須有一套數字證書(一對公鑰和私鑰),可以自己制作(自己頒發的證書需要用戶端驗證通過),可以向組織申請(CA:發放、管理、廢除數字證書的機構));

3.傳送證書(公鑰:包含證書頒發機構、過期時間等資訊);

4.用戶端解析證書(由用戶端的TLS完成:驗證公鑰是否有效,如果發現異常,會彈出一個警告框,提示證書存在問題;如果沒有問題,就會生成一個随機值,然後用證書對随機值加密);

5.用戶端傳送加密資訊(傳送證書加密後的随機值,讓伺服器端得到這個随機值。以後用戶端和伺服器端的通信就是通過這個随機值進行加密解密);

6.伺服器端解密資訊(伺服器端用自己的私鑰解密後,得到用戶端傳來的随機值(私鑰)。然後内容通過該随機值(私鑰)進行對稱加密);

7.伺服器端向用戶端傳輸加密後的資訊(這部分資訊為步驟6中通過随機值進行加密的内容);

8.用戶端解密資訊(用戶端通過該随機值對資訊進行解密。是以整個過程即使被第三方監聽到,也無法擷取明文資訊)。

爬蟲時,會遇到因為https的ssl驗證問題導緻網站通路不了,通常的解決辦法是在代碼裡忽略不信任的證書:

import ssl

url = \'https://12306.cn/index/
context = ssl._create_unverified_context()
res = urlopen(url, context=context)  # 忽略不信任的證書就可以正常通路了      
python豆瓣的簡單爬蟲