目錄
一、 爬蟲的邏輯
二、XPath 爬取網(wǎng)站的數(shù)據(jù)
三、函數(shù)封裝
四、運行結果
一、 爬蟲的邏輯
作業(yè)內容是抓取陽光電影網(wǎng)的下載鏈接:也就是「國內電影」標簽頁面下,第一頁至第七頁的電影的所有下載鏈接。
先看看網(wǎng)站頁面之間的關系:
網(wǎng)站主頁 -> 導航欄 -> 國內電影頁(點擊標簽默認進入第一頁)
-> 具體電影頁面 -> 迅雷下載鏈接
整體的思路:
- 先獲取國內電影頁面第一頁的源代碼;
- 將源代碼的字符串類型轉換為 selector 對象,把它的值賦予變量 HTML;
- 用 XPath 提取出變量 html 中的文本,并把它放入一個列表中;
- 提取的文本有兩個部分,一個部分是國內電影頁面的第一頁的所有影片標題,另一部分是第一頁所有影片標題的 URL(點擊它可進入具體電影頁面),我們將它賦值給變量 new_html;
- 用 XPath 提取出變量 new_html 中的文本,并把它放入一個列表中;
- 這一次提取的文本包括下載鏈接;
- 把列表的文本打印出來,文本就是電影信息和下載鏈接;
- 修改獲取范圍為第一頁至第七頁的源代碼,再打印一次;
二、XPath 爬取網(wǎng)站的數(shù)據(jù)
第一次打?。ㄟ\行結果在文章末尾):
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 導入 requests 模塊,lxml etree
import requests
from lxml import etree
# 我們先獲取國內電影頁面的第一頁。
# 將標簽「國內電影」的第一頁的 URL 粘貼在' '中,并賦值給變量url
url = 'http://www.ygdy8.com/html/gndy/china/list_4_1.html'
res = requests.get(url)
# # 在網(wǎng)頁的源碼搜索 charset 可以發(fā)現(xiàn)網(wǎng)頁編碼為 gb2312,省略這一步會出現(xiàn)亂碼的情況
res.encoding = 'gb2312'
# 如果打印源碼的時候出現(xiàn)報錯,可以把 text 轉換為 content,這一步是需要調試的
html = res.text
# 測試:print(html)
selector = etree.HTML(html)
# 因為在 table 標簽下,所以:
infos = selector.xpath('//table[@class="tbspan"]//a[@class="ulink"]')
# 測試:print(len(infos))
# 循環(huán),打印
# 第一次打印的結果發(fā)現(xiàn)運行結果是列表,所以第二次打印時在列表后面附上[0]
# 第二次打印發(fā)現(xiàn):
# movie_url 的值是 /html/gndy/dyzz/20170806/54699.html,
# 看起來并不是一個完整的 URL,可以進入電影名頁面看看
# 電影名頁面URL:
# http://www.ygdy8.com/html/gndy/dyzz/20170806/54699.html
# 所以在movie_url值里加上了 'http://www.ygdy8.com' + ,
for info in infos:
movie_url = 'http://www.ygdy8.com' + info.xpath('@href')[0]
movie_name = info.xpath('text()')[0]
# print(movie_url, movie_name)
new_url = movie_url
new_res = requests.get(new_url)
new_res.encoding = 'gb2312'
new_html = new_res.text
new_selector = etree.HTML(new_html)
new_infos = new_selector.xpath('//td[@style="WORD-WRAP: break-word"]/a')
for new_info in new_infos:
new_movie_url = new_info.xpath('@href')[0]
new_movie_name = new_info.xpath('text()')[0]
print(movie_url, movie_name, new_movie_url, new_movie_name)
上面的代碼成功獲取國內電影頁面第一頁的所有電影名稱和下載鏈接,接下來我們將函數(shù)封裝,修改獲取范圍為第一頁至第七頁的源代碼,再打印一次。
三、函數(shù)封裝
第二次打?。ㄟ\行結果在文章末尾):
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
from lxml import etree
# 封裝函數(shù)的寫法
def get_movie_url(url):
res = requests.get(url)
res.encoding = 'gb2312'
html = res.text
selector = etree.HTML(html)
infos = selector.xpath('//table[@class="tbspan"]//a[@class="ulink"]')
for info in infos:
movie_url = 'http://www.ygdy8.com' + info.xpath('@href')[0]
movie_name = info.xpath('text()')[0]
get_movie_soure(movie_url, movie_name)
def get_movie_soure(movie_url, movie_name):
new_url = movie_url
new_res = requests.get(new_url)
new_res.encoding = 'gb2312'
new_html = new_res.text
new_selector = etree.HTML(new_html)
new_infos = new_selector.xpath('//td[@style="WORD-WRAP: break-word"]/a')
for new_info in new_infos:
new_movie_url = new_info.xpath('@href')[0]
new_movie_name = new_info.xpath('text()')[0]
print('電影名稱:%r,下載鏈接:%r' % (movie_name, new_movie_url))
if __name__ == '__main__':
base_url = 'http://www.ygdy8.com/html/gndy/china/list_4_%s.html'
for page in range(1, 8):
url = base_url %str(page)
print('第%d頁' % page, '頁面鏈接:', url)
get_movie_url(url)