python豆瓣的簡單爬蟲


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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM