環(huán)境配置
python3
requests
scrapy
在安裝 scrapy 之前需要先安裝Twisted(點(diǎn)擊下載) 下載符合自己版本的Twisted撩笆,然后將其放入 python 安裝目錄中霸奕,先使用命令安裝 pip install Twisted禁灼。安裝完之后,scrapy 就很容易安裝了囤锉,安裝命令如下:pip install scrapy偷溺。
本文要點(diǎn)
1.xpath 基本語(yǔ)法和用法示例
2.使用 xpath 爬取《盜墓筆記》實(shí)例
xpath 基本語(yǔ)法
xpath哄孤,全稱(chēng) XML Path Language,即 XML 路徑語(yǔ)言胸私,它是一門(mén)在 XML 文檔中查找信息的語(yǔ)言厌处。
xpath的選擇功能十分強(qiáng)大,它提供了非常簡(jiǎn)潔明了的路徑選擇表達(dá)式岁疼,幾乎所有我們想要定位的節(jié)點(diǎn)都可以用xpath來(lái)選擇阔涉。首先我們來(lái)看下xpath的基本語(yǔ)法。
在這里列出了 xpath 的常用匹配規(guī)則五续,例如 / 代表選取直接子節(jié)點(diǎn)洒敏,// 代表選擇所有子孫節(jié)點(diǎn)龄恋,. 代表選取當(dāng)前節(jié)點(diǎn)疙驾, .. 代表選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn),@ 則是加了屬性的限定郭毕,選取匹配屬性的特定節(jié)點(diǎn)它碎。
xpath 用法舉例
接下來(lái)我們以豆瓣電影為例子,來(lái)熟悉一下 xpath 基本用法:
打開(kāi)網(wǎng)頁(yè) https://movie.douban.com/top250
豆瓣電影 top250爬蟲(chóng)
首先需要找到我們所匹配的內(nèi)容在 html 中的位置显押。
從圖片中可以看到排名第一的電影標(biāo)題是在標(biāo)簽為 div,class 屬性為 hd 中的 a 標(biāo)簽中所有的span*標(biāo)簽里面扳肛!
然后我們需要一級(jí)一級(jí)往上面找,因?yàn)檫@個(gè)層級(jí)太深了乘碑,有時(shí)候會(huì)匹配不到我們所需要的內(nèi)容挖息。
我們最開(kāi)始匹配的標(biāo)簽要滿足它的所有特征加起來(lái)是唯一的。
很容易看到屬性為 article 正是我們所需要的標(biāo)簽兽肤!因?yàn)檎也坏降诙€(gè) div 標(biāo)簽且 class 屬性為 article 的標(biāo)簽套腹!
獲取電影標(biāo)題語(yǔ)法如下,因?yàn)槭俏谋緝?nèi)容资铡,所以要用 text():
html.xpath(".//div[@class='article']/ol/li[1]//div[@class='hd']/a//span[1]/text()")
同理电禀,我們獲取電影詳情鏈接的語(yǔ)法,因?yàn)槭菍傩裕砸?strong>@屬性值:
html.xpath(".//div[@class='article']/ol/li[1]//div[@class='hd']/a/@href")
我們可以將其加入到爬蟲(chóng)代碼中笤休,效果如下:
使用 xpath 爬取盜墓筆記
目標(biāo)地址:
總體思路:
1.分析網(wǎng)頁(yè)結(jié)構(gòu)尖飞,取出我們需要的標(biāo)題,以及下一步需要用到的鏈接
2.根據(jù)章節(jié)的鏈接地址店雅,再爬取出章節(jié)小說(shuō)
首先分析我們需要爬取的內(nèi)容政基,在網(wǎng)頁(yè)中的位置。
經(jīng)過(guò)上面的講解闹啦,相信大家很容易就可以寫(xiě)出xpath的語(yǔ)法腋么。因?yàn)槲覀兪且廊∷行≌f(shuō)內(nèi)容,所以我們要循環(huán)所有li標(biāo)簽里面的內(nèi)容亥揖!
html.xpath(".//div[@class='box']/ul//li")
遍歷這個(gè)列表珊擂,取出我們所需要的章節(jié)圣勒,詳細(xì)鏈接
li_list = selector.xpath(".//div[@class='box']/ul//li")
for text in li_list:
title = text.xpath("./a/text()").extract_first('')
href = text.xpath('./a/@href').extract_first('')
接下來(lái),從詳情鏈接中取出小說(shuō)內(nèi)容摧扇,即完成了這個(gè)小爬蟲(chóng)圣贸!
p_list = selector.xpath(".//div[@class='content-body']//p")
for data in p_list:
content += data.xpath("./text()").extract_first('')
最重要的分析部分完成了,接下來(lái)主要就是將所有的內(nèi)容放入代碼中扛稽,然后保存到本地就完成了吁峻。
最終爬蟲(chóng)代碼如下:
# coding: utf-8
from scrapy import Selector
import requests
class KeyEnum(object):
TITLE = "title"
CONTENT = "content"
HREF = "href"
class NovelSpider(KeyEnum):
def __init__(self):
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
"AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
}
def spider(self):
url = 'http://seputu.com/'
response = requests.get(url, headers=self.headers)
selector = Selector(text=response.content)
data_list = []
li_list = selector.xpath(".//div[@class='box']/ul//li") # 章節(jié)列表
for text in li_list:
title = text.xpath("./a/text()").extract_first('') # 標(biāo)題
href = text.xpath('./a/@href').extract_first('') # 鏈接
content = self._content_spider(href) # 詳情頁(yè)面爬蟲(chóng)
data_list.append(
{
KeyEnum.HREF: href,
KeyEnum.TITLE: title,
KeyEnum.CONTENT: content,
}
)
return data_list
def _content_spider(self, url):
content = ''
for _ in range(5): # 因?yàn)闆](méi)用代理,如果失敗在张,再重試5次
if url: # 加個(gè)url是否為空的判斷
response = requests.get(url, headers=self.headers)
if response.status_code != 200:
continue
selector = Selector(text=response.content)
p_list = selector.xpath(".//div[@class='content-body']//p")
for data in p_list:
content += data.xpath("./text()").extract_first('')
return content
def main(self):
data_list = self.spider()
for i in data_list:
with open('盜墓筆記.txt', 'a', encoding='utf-8')as f:
f.write(i['content'])
if __name__ == '__main__':
spider = NovelSpider()
spider.main()
總結(jié)
本文主要介紹了 python 中解析庫(kù) xpath 的使用方法和示例用含,用法其實(shí)很簡(jiǎn)單,關(guān)鍵在于多多練習(xí)帮匾!下篇文章打算分享另一個(gè)解析庫(kù) css 的用法啄骇,以及和 xpath 之間的區(qū)別,歡迎關(guān)注瘟斜!