爬虫 lxml 模块
Xpath
在 XML 文档中查找信息的语言, 同样适用于 HTML
辅助工具
Xpath Helper
Chrome插件 快捷键 Ctrl + shift + x
XML Quire
xpath 编辑工具
Xpath 表达式
// 查找所有节点
//book
查找所有的book节点
/ 查找当前节点
//book/title
查找所有book节点下的title子节
@ 获取属性筛选
//book//title/@lang="en"
查找book节点下所有的title节点中,lang属性值为 "en"
[] 当前节点的限制
//bookstore/book[2]/title
查找bookstore下的第2个book节点下的title子节点
//title[@lang]
查找含有 lang 属性的 title节点
| 匹配多路径 (或匹配)
xpath表达式1 | xpath表达式2 | ...
contains() 匹配一个属性值中包含某些字符串的节点
//div[contains(@id,'qiushi_tag_')]
text() 匹配文本值
//book/title/text()="羊驼"
查找 book 下的 title 下文本为"羊驼"节点
lxml
安装
pip install lxml
使用
导入模块
from lxml import etree
创建解析对象
parse_html = etree.HTML(html)
调用 xpath 匹配
r_list = parse_html.xpath('xpath 表达式')
ps: 返回结果以列表形式
示例
抓取指定贴吧所有图片
- 获取贴吧主页URL,下一页,找URL规律
- 获取1页中所有帖子URL地址
- 对每个帖子链接发请求,获取图片URL
- 对每个图片链接发请求,以wb方式写入本地
import requests
from lxml import etree class BaiduSpider(object):
def __init__(self):
self.baseurl = 'http://tieba.baidu.com/f?'
# 使用IE的User-Agent
self.headers = {
'User-Agent': 'Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2; .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; InfoPath.3)'} # 获取帖子链接
def get_turl(self, params):
res = requests.get(
self.baseurl,
params=params,
headers=self.headers
)
res.encoding = 'utf-8'
html = res.text
# 提取帖子链接
parse_html = etree.HTML(html)
t_list = parse_html.xpath('//div[@class="t_con cleafix"]/div/div/div/a/@href')
print(t_list)
# t_list : ['/p/23232/','/p/923423']
for t in t_list:
url = 'http://tieba.baidu.com' + t
# 提取图片链接,对图片链接发请求保存到本地
self.get_imgurl(url) # 获取图片链接
def get_imgurl(self, url):
res = requests.get(url, headers=self.headers)
res.encoding = 'utf-8'
html = res.text
# 提取图片链接列表
parse_html = etree.HTML(html)
# 图片链接列表
img_list = parse_html.xpath(
'//div[@class="d_post_content j_d_post_content clearfix"]/img[@class="BDE_Image"]/@src | //div[@class="video_src_wrapper"]/embed/@data-video')
# 视频链接列表
# img_list = parse_html.xpath('//div[@class="video_src_wrapper"]/embed/@data-video')
print(img_list)
for img in img_list:
self.write_img(img) # 把图片保存到本地
def write_img(self, img):
res = requests.get(img, headers=self.headers)
res.encoding = 'utf-8'
html = res.content
# 保存到本地
filename = img[-10:]
with open(filename, 'wb') as f:
f.write(html)
print('%s下载成功' % filename) # 主函数
def main(self):
name = input('贴吧名:')
begin = int(input('起始页:'))
end = int(input('终止页:'))
for page in range(begin, end + 1):
pn = (page - 1) * 50
# 定义查询参数
params = {
'kw': name,
'pn': str(pn)
}
self.get_turl(params) if __name__ == '__main__':
spider = BaiduSpider()
spider.main()
猫眼电影信息爬取
from urllib import request
import time
import csv
from lxml import etree class MaoyanSpider(object):
def __init__(self):
self.baseurl = 'https://maoyan.com/board/4?offset='
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'}
# 爬取页数计数
self.page = 1 # 获取页面
def get_page(self, url):
req = request.Request(url, headers=self.headers)
res = request.urlopen(req)
html = res.read().decode('utf-8')
# 直接调用解析函数
self.parse_page(html) # 解析页面
def parse_page(self, html):
parse_html = etree.HTML(html)
# 基准xpath,匹配每个电影信息节点对象列表
dd_list = parse_html.xpath('//dl[@class="board-wrapper"]/dd')
# dd_list : [<element dd at xxx>,<...>]
for dd in dd_list:
name = dd.xpath('./a/@title')[0].strip()
star = dd.xpath('.//p[@class="star"]/text()')[0].strip()
time = dd.xpath('.//p[@class="releasetime"]/text()')[0].strip()
print([name, star, time]) # 保存数据(存到csv文件)
def write_page(self, r_list):
# r_list : [(),(),()]
with open('猫眼.csv', 'a') as f:
writer = csv.writer(f)
for rt in r_list:
film = [
rt[0].strip(),
rt[1].strip(),
rt[2].strip()
]
writer.writerow(film) # 主函数
def main(self):
# 用range函数可获取某些查询参数的值
for offset in range(0, 41, 10):
url = self.baseurl + str(offset)
self.get_page(url)
print('第%d页爬取成功' % self.page)
self.page += 1
time.sleep(1) if __name__ == '__main__':
spider = MaoyanSpider()
spider.main()
爬虫 lxml 模块的更多相关文章
- python3爬虫lxml模块的安装
1:在下载lxml之前,要先查看python的版本信息, 在CMD命令行输入python 再输入import pip; print(pip.pep425tags.get_supported()) -- ...
- 洗礼灵魂,修炼python(71)--爬虫篇—【转载】xpath/lxml模块,爬虫精髓讲解
Xpath,lxml模块用法 转载的原因和前面的一样,我写的没别人写的好,所以我也不浪费时间了,直接转载这位崔庆才大佬的 原帖链接:传送门 以下为转载内容: --------------------- ...
- python爬虫网页解析之lxml模块
08.06自我总结 python爬虫网页解析之lxml模块 一.模块的安装 windows系统下的安装: 方法一:pip3 install lxml 方法二:下载对应系统版本的wheel文件:http ...
- Python爬虫基础——XPath语法的学习与lxml模块的使用
XPath与正则都是用于数据的提取,二者的区别是: 正则:功能相对强大,写起来相对复杂: XPath:语法简单,可以满足绝大部分的需求: 所以,如果你可以根据自己的需要进行选择. 一.首先,我们需要为 ...
- 爬虫(六):XPath、lxml模块
1. XPath 1.1 什么是XPath XPath(XML Path Language) 是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. 1.2 ...
- Python爬虫 XPath语法和lxml模块
XPath语法和lxml模块 什么是XPath? xpath(XML Path Language)是一门在XML和HTML文档中查找信息的语言,可用来在XML和HTML文档中对元素和属性进行遍历. X ...
- lxml模块(应用xpath技术)
一.lxml介绍 第三方库lxml是第一款表现出高性能特征的python xml库,天生支持Xpath1.0.XSLT1.0.定制元素类,甚至python风格的数据绑定接口.lxml是通过Cpytho ...
- python爬虫 urllib模块url编码处理
案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦'的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...
- python 爬虫 urllib模块 目录
python 爬虫 urllib模块介绍 python 爬虫 urllib模块 url编码处理 python 爬虫 urllib模块 反爬虫机制UA python 爬虫 urllib模块 发起post ...
随机推荐
- 6、SSH远程管理服务实战
1.SSH基本概述 SSH是一个安全协议,在进行数据传输时,会对数据包进行加密处理,加密后在进行数据传输.确保了数据传输安全.那SSH服务主要功能有哪些呢? 1.提供远程连接服务器的服务. 2.对传输 ...
- casperjs 源码
1.首当其冲github 地址: https://github.com/casperjs
- arm交叉编译sudo-1.8.6p7
1.交叉编译 # tar -xvf sudo-1.8.6p7.tar.gz # cd sudo-1.8.6p7/ # mkdir build # ./configure --prefix=/home/ ...
- STM32WB HSE校准
通过改变RCC_HSECR寄存器中的HSETUNE[5:0]位域的值来校准HSE的输出频率 1.将HSE时钟配置为MCO模式输出到PA8引脚 HAL_RCC_MCOConfig(RCC_MCO1, R ...
- shell i/o交互及重定向
标准输入:/dev/stdin,文件描述号:0,默认设备:键盘 标准输出:/dev/stdout,文件描述号:1,默认设备:显示器 标准错误输出:/dev/stderr,文件描述号:2,默认设备:显示 ...
- JMeter 控件整理
一个线程组里多个请求的情况下,添加用户参数.如添加random函数,若不勾选“每次迭代更新一次”则每发送一个请求调用一次random函数,勾选上之后,整个线程组运行过程只调用一次random函数.
- C#形参和实参、引用类型和值类型使用时的一个注意点。
这是早上群里讨论的例子. static void main(string [] arg){ var p1=new Person{Name="张三"}; var p2=new Per ...
- 箭头函数 -ES6
1)函数参数只有一个:可以省略 ( ) var f = a => a 等同于 var f = function (a) { return a } 2)函数内部语句只有一个:可以省略 { ...
- Fastjson转换json到带泛型的对象(如Map)报错解决
List<CategoryDTO> categoryList = null; String categoryStr = redisService.get(RedisKeyConstant. ...
- Python3之正则表达式详解
正则表达式 本节我们看一下正则表达式的相关用法,正则表达式是处理字符串的强大的工具,它有自己特定的语法结构,有了它,实现字符串的检索.替换.匹配验证都不在话下. 当然对于爬虫来说,有了它,我们从HTM ...