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) # 忽略不信任的證書就可以正常訪問了