Grundlegende Verwendung der Python-Crawler-Xpath-Datenanalyse

Haftungsausschluss: Seit der Veröffentlichung dieses Artikels dient dieser Artikel nur als Referenz und darf nicht reproduziert oder kopiert werden. Wenn die Partei, die diesen Artikel durchsucht, an einem Verstoß gegen nationale Gesetze und Vorschriften beteiligt ist, trägt die Partei, die diesen Artikel durchsucht, alle Konsequenzen und hat nichts mit dem Blogger dieses Artikels zu tun. Und aufgrund des Nachdrucks, Kopierens und anderer Vorgänge der Partei, die diesen Artikel durchsucht, werden alle Streitigkeiten, die durch Verstöße gegen nationale Gesetze und Vorschriften und alle Konsequenzen verursacht werden, von der Partei getragen, die diesen Artikel durchsucht, und haben nichts mit dem Blogger dieses Artikels zu tun.

Xpath-Parsing ist häufiger als BS4-Parsing.

import requests
from lxml import etree

1. Grundlegende Grammatik

1.1 HTML-Grammatik analysieren

Analysieren Sie lokale Dateien

# 解析本地 html 文件
parser = etree.HTMLParser(encoding="utf-8")
tree = etree.parse("./data/base/taobao.html", parser=parser)

Analysieren Sie Webdateien

# url, UA
url = "https://www.aqistudy.cn/historydata/"
headers = {
    
    
	"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"
}
text = requests.get(url=url, headers=headers).text
# 解析
tree = etree.HTML(text, etree.HTMLParser(encoding="utf-8"))

tree.xpath() Als Bezeichnung festlegen, als Liste zurückgeben.

1.2 Tags abrufen

/: Stellt eine Ebene dar, beginnend mit der Positionierung des Wurzelknotens .
//: Bei einer Darstellung mehrerer Ebenen kann die Positionierung von jeder Position aus gestartet werden .
[n]: Die Positionierung des ersten Etiketts repräsentiert den Index von 1Anfang an.

xpath = tree.xpath("/html/body/div")
print(xpath)
print(tree.xpath("/html//div"))
print(tree.xpath("/html/body/div[2]"))

Fügen Sie hier eine Bildbeschreibung ein

1.3 Holen Sie sich den Inhalt in das Etikett

Suchen Sie ein Attribut-Tag
[@attribute='attributeValue'] : genau übereinstimmen, nicht enthalten.

# 属性定位
print(tree.xpath("//div[@class='site-nav']"))
# 索引定位: 索引从 1 开始
print(tree.xpath("//div[@class='tb-ie-updater-box']/a[2]"))

Fügen Sie hier eine Bildbeschreibung ein

1.4 Holen Sie sich die Attribute in die Beschriftung

/text(): Direkter Inhalt, Rückgabeliste
//text().: Alle Inhalte, Rückgabeliste
/@attribute.: Attributwert abrufen, Liste zurückgeben.

# 取数据 /text(): 直系内容, 返回 List. //text(): 所有内容, 返回 List.
print(tree.xpath("//div[@class='tb-ie-updater-box']/a[2]/text()"))
print(tree.xpath("//div[@class='tb-ie-updater-box']/a[2]//text()"))
# 取属性值
print(tree.xpath("//div[@class='tb-ie-updater-box']/a/@href"))

Fügen Sie hier eine Bildbeschreibung ein

1.5 Knoten durch Inhalt finden

Fuzzy Matching : Präzises Matching :[contains(text(),"text")]
[text()="text"]

2. Beispiele

Krieche durch die Stadt

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import requests
from lxml import etree


if __name__ == '__main__':
    
    # url, UA
    url = "https://www.aqistudy.cn/historydata/"
    headers = {
    
    
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:84.0) Gecko/20100101 Firefox/84.0"
    }
    text = requests.get(url=url, headers=headers).text
    # 解析
    tree = etree.HTML(text, etree.HTMLParser(encoding="utf-8"))
    ul = tree.xpath("//div[@class='all']/div[@class='bottom']/ul")
    # 建立文件
    fp = open("./data/city/city_zm.txt", "w", encoding="utf-8")
    # 循环 ul
    for ul_zm in ul:
        zm = ul_zm.xpath("./div[1]/b/text()")[0]
        fp.write(zm + " " + ", ".join(ul_zm.xpath("./div[2]/li/a/text()")) + "\n")
        print(zm + " 添加完成")
    fp.close()

Fügen Sie hier eine Bildbeschreibung ein

Informationen zu Gebrauchtwohnungen

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import requests
from lxml import etree
import re


if __name__ == '__main__':

    # url, UA
    url = "https://bj.58.com/ershoufang/"
    headers = {
    
    
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0"
    }
    # 爬取
    text = requests.get(url=url, headers=headers).text
    # 解析
    tree = etree.HTML(text, etree.HTMLParser(encoding="utf-8"))
    xpath = tree.xpath("//ul[@class='house-list-wrap']/li")
    # 建立文件
    fp = open("data/esf/ershoufang.txt", "w", encoding="utf-8")
    fp.write("title\tprice\tbase_info\tjjr_info\tpeople_name\n")
    # 循环二手房的 li 标签
    for li_path in xpath:
        # 得到相应的内容
        title = li_path.xpath("./div[@class='list-info']/h2/a/text()")
        price = li_path.xpath("./div[@class='price']/p//text()")
        base_info = li_path.xpath("./div[@class='list-info']/p/span//text()")
        jjr_info = li_path.xpath("./div[@class='list-info']/div/span[1]/text()")
        people_name = li_path.xpath("./div[@class='list-info']/div/a/span/text()")
        replace_base_info = re.sub(" +", " ", re.sub("[\t|\n]", "", " ".join(base_info)))
        replace_jjr_info = re.sub(" +", " ", re.sub("[\t|\n]", "", " ".join(jjr_info)))

        # 写入内容
        fp.write(f"{''.join(title[0].split())}\t{' '.join(price)}\t{replace_base_info}\t{replace_jjr_info}\t{' '.join(people_name)}\n")
        print(f"{''.join(title[0].split())}\t{' '.join(price)}\t{replace_base_info}\t{replace_jjr_info}\t{' '.join(people_name)}")
    fp.close()

Fügen Sie hier eine Bildbeschreibung ein

Crawl Beauty-Fotos

#!/usr/bin/env python
# -*- coding: UTF-8 -*-

import requests
from lxml import etree
import os


if __name__ == '__main__':

    for page in range(1, 172):
        # url, UA
        # url = page == 1 ? "http://pic.netbian.com/4kmeinv/" : f"http://pic.netbian.com/4kmeinv/index_{page}.html"
        url = "http://pic.netbian.com/4kmeinv/" if page == 1 else f"http://pic.netbian.com/4kmeinv/index_{page}.html"
        headers = {
    
    
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:82.0) Gecko/20100101 Firefox/82.0"
        }
        # 爬取
        response = requests.get(url=url, headers=headers)
        # 解决乱码问题
        response.encoding = response.apparent_encoding
        text = response.text
        # 解析
        tree = etree.HTML(text, etree.HTMLParser(encoding="utf-8"))
        xpath = tree.xpath("//ul[@class='clearfix']/li")
        # 建立文件夹
        if not os.path.exists("./data/mn/%d" % page):
            os.makedirs("./data/mn/%d" % page)
        # 循环美女图片的 li 标签
        for li_path in xpath:
            img_url = "http://pic.netbian.com" + li_path.xpath(".//img/@src")[0]
            # 生成图片
            with open("./data/mn/%d/%s.jpg" % (page, li_path.xpath(".//img/@alt")[0]), "wb") as f:
                f.write(requests.get(url=img_url, headers=headers).content)
        print("%d 页下载完成" % page)

Fügen Sie hier eine Bildbeschreibung ein

Ich denke du magst

Origin blog.csdn.net/YKenan/article/details/111985380
Empfohlen
Rangfolge