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 von1
Anfang an.
xpath = tree.xpath("/html/body/div")
print(xpath)
print(tree.xpath("/html//div"))
print(tree.xpath("/html/body/div[2]"))
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]"))
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"))
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()
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()
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)