廖雪峯爬蟲第六節(Xpath)

xpath基礎語法

import re
import requests

# 安裝支持 解析html和XML的解析庫 lxml
# pip install lxml
from lxml import etree

url = 'http://news.baidu.com/'
headers = {
    "User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}

# 用response.text 不太準確 轉碼 是靠推測
data = requests.get(url, headers=headers).content.decode('utf-8')

# 1.轉解析類型
xpath_data = etree.HTML(data)


# xpath 語法 1. 節點 /
#            2. 跨節點: //
#            3. 精確的標籤: //a[@屬性="屬性值"]
#            4. 標籤包裹的內容 text()
#            5. 屬性:@href
#              xpath--數據類型---list
# 2調用 xpath的方法
result = xpath_data.xpath('/html/head/title//text()')
result = xpath_data.xpath('//a/text()')
result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]/text()')
result = xpath_data.xpath('//a[@mon="ct=1&a=2&c=top&pn=18"]/@href')


print(result)


爬取巴比特網站的信息

import requests
from lxml import etree
import json


class BtcSpider(object):
    def __init__(self):
        self.base_url = 'http://8btc.com/forum-61-'
        self.headers = {
            "User-Agent": 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
        }

        self.data_list = []

    # 1.發請求
    def get_response(self, url):
        response = requests.get(url, headers=self.headers)
        # 網頁的 編碼到底 是 gbk 還是 urf-8  head--meta-charset=""
        # 原因 是 抓取 網頁的 編碼 就是 gbk的 所以 解碼的時候 也是要gbk
        # data = response.content.decode('utf-8')
        data = response.content
        return data

    # 2.解析數據
    def parse_data(self, data):
        # 使用xpath 解析當前頁面 所有的 新聞title 和url 保存
        # 1.轉類型
        x_data = etree.HTML(data)

        # 2.根據xpath路徑解析
        # 路徑 1. 純手寫  2. 藉助瀏覽器的 右擊 粘貼xpath路徑; 需要修改
        title_list = x_data.xpath('//a[@class="s xst"]/text()')
        # title_list = x_data.xpath('//form[@id="moderate"]/div/div[2]/div/a[@class="s xst"]/text()')
        url_list = x_data.xpath('//a[@class="s xst"]/@href')

        for index, title in enumerate(title_list):
            news = {}
            # print(index)
            # print(title)
            news['name'] = title
            news['url'] = url_list[index]
            self.data_list.append(news)

    # 3.保存數據
    def save_data(self):

        # 將 list---str
        data_str = json.dumps(self.data_list)
        with open('05btc.json', 'w',encoding='utf-8') as f:
            f.write(data_str)

    # 4.啓動
    def run(self):

        for i in range(1, 5):
            # 1.拼接 完整url
            url = self.base_url + str(i) + '.html'
            print(url)
            # 2.發請求
            data = self.get_response(url)

            # 3.做解析
            self.parse_data(data)
        # 4.保存
        self.save_data()


BtcSpider().run()

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章