https://movie.douban.com/
直奔主題,給個要爬取的豆瓣電影位址,爬取熱門電影名字。

右鍵選擇檢視網頁源碼,我們可以發現在網頁靜态源碼裡,是找不到‘來電狂想’這些關鍵字的。
通過檢查網頁,檢視network下的XHR,我們可以找到對應的資訊。說明我們想要爬取的這部分内容是通過Ajax從背景拿到的json資料。
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) # 忽略不信任的證書就可以正常通路了