前言:
那麼什麼是爬蟲呢?我們把網際網路有價值的資訊都比喻成大的蜘蛛網,而各個節點就是存放的資料,而蜘蛛網的上蜘蛛比喻成爬蟲,而爬蟲是可以自動抓取網際網路資訊的程式,從網際網路上抓取一切有價值的資訊,並且把站點的html和js返回的圖片爬到本地,並且儲存方便使用。
實踐:爬取電影天堂電影詳情頁
網頁分析及爬取第一頁的詳情頁url
從電影天堂最新電影介面。可以看到其第一頁url為 http://www。ygdy8。net/html/gndy/dyzz/list_23_1。html,第二頁為http://www。ygdy8。net/html/gndy/dyzz/list_23_2。html,第三第四頁也類似。
from lxml import etreeimport requestsurl = ‘http://www。ygdy8。net/html/gndy/dyzz/list_23_1。html’headers = { ‘User_Agent’:‘Mozilla/5。0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537。36 (KHTML, like Gecko) Chrome/69。0。3497。100 Safari/537。36’,}response = requests。get(url,headers=headers)# response。text 是系統自己預設判斷。但很遺憾判斷錯誤,導致亂碼出現。我們可以採取另外方式 response。content。自己指定格式解碼# print(response。text)# print(response。content。decode(‘gbk’))print(response。content。decode(encoding=“gbk”, errors=“ignore”))
先以第一頁為例,列印資料如下:
分析電影天堂 html 原始碼,可以得出每個 table 標籤就是一個電影
透過 xpath 拿到每個電影的詳情url
html = etree。HTML(text)detail_urls = html。xpath(“//table[@class=‘tbspan’]//a/@href”)for detail_url in detail_urls: print(detail_url) #加上域名即為詳情 url
結果:
2。
整理程式碼並爬取前7頁的電影列表url.
from lxml import etreeimport requests# 域名BASE_DOMAIN = ‘http://www。ygdy8。net’# url = ‘http://www。ygdy8。net/html/gndy/dyzz/list_23_1。html’HEADERS = { ‘User_Agent’:‘Mozilla/5。0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537。36 (KHTML, like Gecko) Chrome/69。0。3497。100 Safari/537。36’,}def spider(): base_url = ‘http://www。ygdy8。net/html/gndy/dyzz/list_23_{}。html’ for x in range(1,8): url = base_url。format(x) print(url) # 求出每一頁電影列表的url eg: http://www。ygdy8。net/html/gndy/dyzz/list_23_1。htmlif __name__ == ‘__main__’: spider()
3。
爬取每一部電影的詳情頁地址
def get_detail_urls(url): response = requests。get(url, headers=HEADERS) # response。text 是系統自己預設判斷。但很遺憾判斷錯誤,導致亂碼出現。我們可以採取另外方式 response。content。自己指定格式解碼 # print(response。text) # print(response。content。decode(‘gbk’)) # print(response。content。decode(encoding=“gbk”, errors=“ignore”)) text = response。content。decode(encoding=“gbk”, errors=“ignore”) # 透過 xpath 拿到每個電影的詳情url html = etree。HTML(text) detail_urls = html。xpath(“//table[@class=‘tbspan’]//a/@href”) detail_urls = map(lambda url:BASE_DOMAIN+url,detail_urls) #這句意思相當於下面一段程式碼:替換列表中的每一個url # def abc(url): # return BASE_DOMAIN+url # index = 1 # for detail_url in detail_urls: # detail_url = abc(detail_url) # detail_urls[index] = detail_url # index+1 return detail_urls
4。
抓取電影詳情頁的資料
# 解析詳情頁面def parse_detail_page(url): movie = {} response = requests。get(url,headers = HEADERS) text = response。content。decode(‘gbk’, errors=‘ignore’) html = etree。HTML(text) # title = html。xpath(“//div[@class=‘title_all’]//font[@color=‘#07519a’]”) # 本行47行,下面已修改 # 打印出 [
最後結果: