1.本文使用的python版本是python3css
2.使用到的依賴包以下:html
requests
scrapypython
在安裝 scrapy 以前須要先安裝 Twisted(點擊下載) 下載符合本身版本的 Twisted,而後將其放入 python 安裝目錄中,先使用命令安裝 pip install Twisted。安裝完以後,scrapy 就很容易安裝了,安裝命令以下: pip install scrapy。
編程
1.xpath 基本語法和用法示例app
2.使用 xpath 爬取《盜墓筆記》實例scrapy
xpath,全稱 XML Path Language,即 XML 路徑語言,它是一門在 XML 文檔中查找信息的語言。
xpath 的選擇功能十分強大,它提供了很是簡潔明瞭的路徑選擇表達式,幾乎全部咱們想要定位的節點均可以用 xpath 來選擇。首先咱們來看下 xpath 的基本語法。
ide
在這裏列出了xpath的經常使用匹配規則,例如 / 表明選取直接子節點,// 表明選擇全部子孫節點,. 表明選取當前節點,.. 表明選取當前節點的父節點,@ 則是加了屬性的限定,選取匹配屬性的特定節點。url
接下來咱們以豆瓣電影爲例子,來熟悉一下 xpath 基本用法:
打開網頁 https://movie.douban.com/top250
spa
html.xpath(".//div[@class='article']/ol/li[1]//div[@class='hd']/a//span[1]/text()")
複製代碼
同理,咱們獲取電影詳情連接的語法,由於是屬性,因此要用 @屬性值:代理
html.xpath(".//div[@class='article']/ol/li[1]//div[@class='hd']/a/@href")
複製代碼
咱們能夠將其加入到爬蟲代碼中,效果以下:
目標地址:
盜墓筆記全篇 http://seputu.com/
整體思路:
首先分析咱們須要爬取的內容,在網頁中的位置。
通過上面的講解,相信你們很容易就能夠寫出 xpath 的語法。由於咱們是要爬取全部小說內容,因此咱們要循環全部 li 標籤裏面的內容!
html.xpath(".//div[@class='box']/ul//li")
複製代碼
遍歷這個列表,取出咱們所須要的章節,詳細連接
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('')
複製代碼
接下來,從詳情連接中取出小說內容,即完成了這個小爬蟲!
p_list = selector.xpath(".//div[@class='content-body']//p")
for data in p_list:
content += data.xpath("./text()").extract_first('')
複製代碼
最重要的分析部分完成了,接下來主要就是將全部的內容放入代碼中,而後保存到本地就完成了。
# 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") # 章節列表
for text in li_list:
title = text.xpath("./a/text()").extract_first('') # 標題
href = text.xpath('./a/@href').extract_first('') # 連接
content = self._content_spider(href) # 詳情頁面爬蟲
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): # 由於沒用代理,若是失敗,再重試5次
if url: # 加個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()
複製代碼
本文主要介紹了 python 中解析庫 xpath 的使用方法和示例,用法其實很簡單,關鍵在於多多練習!下篇文章打算分享另外一個解析庫 css 的用法,以及和 xpath 之間的區別,歡迎關注!
若是以爲不錯或對你有幫助,請分享給更多人
關注[Python編程與實戰]
從零開始學Python,提高Python技能