老年人第三次py爬虫
看了点lxml利用etree转译html代码 然后利用xpath语法进行筛选
pyCharm下载lxml
参照第一次下载requests
lxml 和 etree
lxml 是xml解析库,很好的支持html
使用先导入
from lxml import etree
#基本使用
text=request.get(“网址”,headers = “伪装请求头”)
html = etree.HTML(text)
print(etree.tostring(html))
xpath语法
具体语法略
常用的是
//
html标签
表示匹配这个html标签的内容而不考虑他们的位置
如 //tr 表示tr下所有内容
/父html标签/子html标签 [数字]
表示这个父类标签下第几个子html标签
如//div/div[1]/div/table[1] 表示一个div下面第一个div下面的div下面第一个table
html标签[@
标签属性 = ‘…’] 或者 html标签/@
标签属性
如
tr[@class = ‘item’] 意为取class等于item的<tr>包含的内容
div/a/@href 意为 取<a> 的href值
标签/text()
意为 取标签包括的文字 如span/text()
需要注意的这些取出来都是集合类型。要手动循环取值或者取[0]第一个值
要是觉的很绕也可以使用开发者工具的copy xpath复制详细的xpath路径。(和copy selector一样操作)
就是xpath不能像selector一样去掉[数字] 就能全部匹配
原则上xpath的选择要从大到小选择
例如想爬所有书的图片名字等信息
通过观察class = "item"的tr标签是整本书的父标签
直接copy xpath能得到
’//*[@id=“content”]/div/div[1]/div/table[1]/tbody/tr‘
如果直接使用的话就是爬取第一本的数据
根据上面说的可以吧xpath修改成
’//tr[@class=“item”]'
就能爬出item的集合
xpath在代码中 跟在etree.HTML()后使用
request = requests.get(url, headers=header)
selector = etree.HTML(request.text)
infos = selector.xpath('//tr[@class="item"]')
拓展 csv文件
一种列表文件 能直接用Excel打开
import csv
使用
实例
from lxml import etree
import requests
import csv
# 具体地址具体设置 wt模式下,Python写文件时会用\r\n来表示换行 newline='',表示换行
file = open('C:/Users/.../Desktop/douban.csv', 'wt', newline='', encoding='utf-8')
writer = csv.writer(file)
# 写表头
writer.writerow(('书名', 'url地址', '作者', '出版社', '出版时间', '价格', '评分', '评价'))
# url集合 规律是这样
urls = ['https://book.douban.com/top250?start={}'.format(str(i)) for i in range(0, 250, 25)]
# 请求头 不说
header = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/81.0.4044.122 Safari/537.36'
}
for url in urls:
print(url)
request = requests.get(url, headers=header)
# lxml解析数据 还有补全遗漏标签功能 不能识别tbody标签 大坑
selector = etree.HTML(request.text.replace("<tbody>", "").replace("</tbody>", ""))
# //tr[@class="item"] 表示直接查找所有class="iitem"的tr 直接用copy xpath太长了
infos = selector.xpath('//tr[@class="item"]')
for info in infos:
# 书名 td/div/a/@title 表示 原先查找的//tr[@class="item"]下 按td>div>获取a的title属性 因为这个顺序在树中是唯一的所以可以不用指定[第几个] 后面有[第几个]的是我直接copy xpath的
name = info.xpath('td/div/a/@title')[0]
# 链接
url = info.xpath('td/div/a/@href')[0]
# 评分 text()表示span包裹的文字
rate = info.xpath('td/div[2]/span[2]/text()')[0]
# 评价
print()
comment = info.xpath('td/p[2]/span/text()')[0] if len(info.xpath('td/p[2]/span/text()')) > 0 else "空"
# 翻译作品 有5个字段 原作有4个字段 -3能使5个字段的时候跳过翻译
book_infos = str(info.xpath('td/p/text()')[0]).split('/')
# 作者
author = book_infos[0]
# 翻译
publisher = book_infos[-3]
# 出版时间
data = book_infos[-2]
# 价格
price = book_infos[-1]
writer.writerow((name, url, author, publisher, data, price, rate, comment))
file.close()
结果