目錄
一萨咳、 爬蟲(chóng)的邏輯
二弛随、XPath 爬取網(wǎng)站的數(shù)據(jù)
三、函數(shù)封裝
四塘娶、運(yùn)行結(jié)果
一纹坐、 爬蟲(chóng)的邏輯
作業(yè)內(nèi)容是抓取陽(yáng)光電影網(wǎng)的下載鏈接:也就是「國(guó)內(nèi)電影」標(biāo)簽頁(yè)面下枝冀,第一頁(yè)至第七頁(yè)的電影的所有下載鏈接。
先看看網(wǎng)站頁(yè)面之間的關(guān)系:
網(wǎng)站主頁(yè) -> 導(dǎo)航欄 -> 國(guó)內(nèi)電影頁(yè)(點(diǎn)擊標(biāo)簽?zāi)J(rèn)進(jìn)入第一頁(yè))
-> 具體電影頁(yè)面 -> 迅雷下載鏈接
整體的思路:
- 先獲取國(guó)內(nèi)電影頁(yè)面第一頁(yè)的源代碼耘子;
- 將源代碼的字符串類型轉(zhuǎn)換為 selector 對(duì)象果漾,把它的值賦予變量 HTML;
- 用 XPath 提取出變量 html 中的文本谷誓,并把它放入一個(gè)列表中绒障;
- 提取的文本有兩個(gè)部分,一個(gè)部分是國(guó)內(nèi)電影頁(yè)面的第一頁(yè)的所有影片標(biāo)題片林,另一部分是第一頁(yè)所有影片標(biāo)題的 URL(點(diǎn)擊它可進(jìn)入具體電影頁(yè)面)端盆,我們將它賦值給變量 new_html;
- 用 XPath 提取出變量 new_html 中的文本费封,并把它放入一個(gè)列表中焕妙;
- 這一次提取的文本包括下載鏈接;
- 把列表的文本打印出來(lái)弓摘,文本就是電影信息和下載鏈接焚鹊;
- 修改獲取范圍為第一頁(yè)至第七頁(yè)的源代碼,再打印一次韧献;
二末患、XPath 爬取網(wǎng)站的數(shù)據(jù)
第一次打印(運(yùn)行結(jié)果在文章末尾):
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# 導(dǎo)入 requests 模塊锤窑,lxml etree
import requests
from lxml import etree
# 我們先獲取國(guó)內(nèi)電影頁(yè)面的第一頁(yè)璧针。
# 將標(biāo)簽「國(guó)內(nèi)電影」的第一頁(yè)的 URL 粘貼在' '中,并賦值給變量url
url = 'http://www.ygdy8.com/html/gndy/china/list_4_1.html'
res = requests.get(url)
# # 在網(wǎng)頁(yè)的源碼搜索 charset 可以發(fā)現(xiàn)網(wǎng)頁(yè)編碼為 gb2312渊啰,省略這一步會(huì)出現(xiàn)亂碼的情況
res.encoding = 'gb2312'
# 如果打印源碼的時(shí)候出現(xiàn)報(bào)錯(cuò)探橱,可以把 text 轉(zhuǎn)換為 content,這一步是需要調(diào)試的
html = res.text
# 測(cè)試:print(html)
selector = etree.HTML(html)
# 因?yàn)樵?table 標(biāo)簽下绘证,所以:
infos = selector.xpath('//table[@class="tbspan"]//a[@class="ulink"]')
# 測(cè)試:print(len(infos))
# 循環(huán)隧膏,打印
# 第一次打印的結(jié)果發(fā)現(xiàn)運(yùn)行結(jié)果是列表,所以第二次打印時(shí)在列表后面附上[0]
# 第二次打印發(fā)現(xiàn):
# movie_url 的值是 /html/gndy/dyzz/20170806/54699.html嚷那,
# 看起來(lái)并不是一個(gè)完整的 URL胞枕,可以進(jìn)入電影名頁(yè)面看看
# 電影名頁(yè)面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)
上面的代碼成功獲取國(guó)內(nèi)電影頁(yè)面第一頁(yè)的所有電影名稱和下載鏈接魏宽,接下來(lái)我們將函數(shù)封裝腐泻,修改獲取范圍為第一頁(yè)至第七頁(yè)的源代碼决乎,再打印一次。
三贫悄、函數(shù)封裝
第二次打尤鹎(運(yùn)行結(jié)果在文章末尾):
#!/usr/bin/env python3
# -*- coding: utf-8 -*-
import requests
from lxml import etree
# 封裝函數(shù)的寫(xiě)法
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頁(yè)' % page, '頁(yè)面鏈接:', url)
get_movie_url(url)