環境配置
1.本文使用的python版本是python3css
2.使用到的依賴包以下:html
requests
scrapypython
在安裝 scrapy 以前須要先安裝 Twisted 地址: https://www.lfd.uci.edu/~gohlke/pythonlibs/#twisted。下載符合本身版本的 Twisted,而後將其放入 python 安裝目錄中,先使用命令安裝 pip install Twisted。安裝完以後,scrapy 就很容易安裝了,安裝命令以下: pip install scrapy。
編程
本文要點
1.xpath 基本語法和用法示例微信
2.使用 xpath 爬取《盜墓筆記》實例app
xpath 基本語法
xpath,全稱 XML Path Language,即 XML 路徑語言,它是一門在 XML 文檔中查找信息的語言。
xpath 的選擇功能十分強大,它提供了很是簡潔明瞭的路徑選擇表達式,幾乎全部咱們想要定位的節點均可以用 xpath 來選擇。首先咱們來看下 xpath 的基本語法。
scrapy
在這裏列出了xpath的經常使用匹配規則,例如 / 表明選取直接子節點,// 表明選擇全部子孫節點,. 表明選取當前節點,.. 表明選取當前節點的父節點,@ 則是加了屬性的限定,選取匹配屬性的特定節點。ide
xpath 用法舉例
接下來咱們以豆瓣電影爲例子,來熟悉一下 xpath 基本用法:
打開網頁 https://movie.douban.com/top250
url
首先須要找到咱們所匹配的內容在 html 中的位置。
從圖片中能夠看到排名第一的電影標題是在標籤爲 div,class 屬性爲 *hd中的 a 標籤中全部的 span 標籤裏面!
而後咱們須要一級一級往上面找,由於這個層級太深了,有時候會匹配不到咱們所須要的內容。
咱們最開始匹配的標籤要知足它的全部特徵加起來是惟一的。
很容易看到屬性爲 article 正是咱們所須要的標籤!由於找不到第二個 div 標籤且 class 屬性爲 article 的標籤!
由於是文本內容,因此要用 text(),獲取電影標題語法以下 :
1html.xpath(".//div[@class='article']/ol/li[1]//div[@class='hd']/a//span[1]/text()")
同理,咱們獲取電影詳情連接的語法,由於是屬性,因此要用 @屬性值:spa
1html.xpath(".//div[@class='article']/ol/li[1]//div[@class='hd']/a/@href")
咱們能夠將其加入到爬蟲代碼中,效果以下:
使用 xpath 爬取盜墓筆記
目標地址:
盜墓筆記全篇 http://seputu.com/
整體思路:
1.分析網頁結構,取出咱們須要的標題,以及下一步須要用到的連接
2.根據章節的連接地址,再爬取出章節小說
首先分析咱們須要爬取的內容,在網頁中的位置。
通過上面的講解,相信你們很容易就能夠寫出 xpath 的語法。由於咱們是要爬取全部小說內容,因此咱們要循環全部 li 標籤裏面的內容!
1html.xpath(".//div[@class='box']/ul//li")
遍歷這個列表,取出咱們所須要的章節,詳細連接
1li_list = selector.xpath(".//div[@class='box']/ul//li")
2 for text in li_list:
3 title = text.xpath("./a/text()").extract_first('')
4 href = text.xpath('./a/@href').extract_first('')
接下來,從詳情連接中取出小說內容,即完成了這個小爬蟲!
1p_list = selector.xpath(".//div[@class='content-body']//p")
2 for data in p_list:
3 content += data.xpath("./text()").extract_first('')
最重要的分析部分完成了,接下來主要就是將全部的內容放入代碼中,而後保存到本地就完成了。
最終爬蟲代碼以下:
1# coding: utf-8
2from scrapy import Selector
3import requests
4
5
6class KeyEnum(object):
7 TITLE = "title"
8 CONTENT = "content"
9 HREF = "href"
10
11
12class NovelSpider(KeyEnum):
13
14 def __init__(self):
15 self.headers = {
16 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) "
17 "AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36"
18 }
19
20 def spider(self):
21 url = 'http://seputu.com/'
22 response = requests.get(url, headers=self.headers)
23 selector = Selector(text=response.content)
24 data_list = []
25 li_list = selector.xpath(".//div[@class='box']/ul//li") # 章節列表
26 for text in li_list:
27 title = text.xpath("./a/text()").extract_first('') # 標題
28 href = text.xpath('./a/@href').extract_first('') # 連接
29 content = self._content_spider(href) # 詳情頁面爬蟲
30 data_list.append(
31 {
32 KeyEnum.HREF: href,
33 KeyEnum.TITLE: title,
34 KeyEnum.CONTENT: content,
35 }
36 )
37
38 return data_list
39
40 def _content_spider(self, url):
41 content = ''
42
43 for _ in range(5): # 由於沒用代理,若是失敗,再重試5次
44 if url: # 加個url是否爲空的判斷
45 response = requests.get(url, headers=self.headers)
46 if response.status_code != 200:
47 continue
48 selector = Selector(text=response.content)
49
50 p_list = selector.xpath(".//div[@class='content-body']//p")
51 for data in p_list:
52 content += data.xpath("./text()").extract_first('')
53
54 return content
55
56 def main(self):
57 data_list = self.spider()
58 for i in data_list:
59 with open('盜墓筆記.txt', 'a', encoding='utf-8')as f:
60 f.write(i['content'])
61
62
63if __name__ == '__main__':
64 spider = NovelSpider()
65 spider.main()
總結
本文主要介紹了 python 中解析庫 xpath 的使用方法和示例,用法其實很簡單,關鍵在於多多練習!下篇文章打算分享另外一個解析庫 css 的用法,以及和 xpath 之間的區別,歡迎關注!
若是以爲不錯或對你有幫助,請分享給更多人
關注[Python編程與實戰]
從零開始學Python,提高Python技能
本文分享自微信公衆號 - Python編程與實戰(GoPy1024)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。