老年人第三次爬虫 简单lxml爬虫


看了点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()

结果
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值