版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/luohongtuCSDN/article/details/82889517
目录:
python爬虫 Day04
Xpath工具(解析html)
Xpath
- 在XML文档中查找信息的语言,同样适用于HTML文档的检索
Xpath辅助工具
- Chrome插件 : XPath Helper
打开/关闭 : Ctrl + Shift + 大写X - FireFox插件 :XPath checker
- XPath表达式编辑工具 : XML Quire
XPath匹配规则
- 匹配演示
- 查找bookstore下面的所有节点 : /bookstore
- 查找所有的book节点 : //book
- 查找所有book节点下title节点中,lang属性为"en"的节点 : //book/title[@lang=“en”]
- 选取节点
/
: 从根节点开始选取 /bookstore
//
: 从整个文档中查找某个节点 //price
@
: 选取某个节点的属性 //title[@lang=“en”] - @使用
- 选取1个节点 : //title[@lang=“en”]
- 选取N个节点 : //title[@lang]
- 选取节点属性值 : //title/@lang
- 匹配多路径
- 符号 : |
- 示例
- 获取所有book节点下的title节点和price节点
//book/title | //book/price
- 函数
- contains() : 匹配1个属性值中包含某些字符串的节点
//title[contains(@lang,"e")]
安装环境
- win7 环境
- 进入cmd ,输入:
python -m pip install lxml
- 进入cmd ,输入:
解析HTML源码
- lxml库 : HTML/XML解析库
- 安装
conda install lxml
pip install lxml
- 安装
- 使用流程
- 利用lxml库的etree模块构建解析对象
- 解析对象调用xpath工具定位节点信息
- 使用
- 导入模块 from lxml import etree
- 创建解析对象 : parseHtml = etree.HTML(html)
- 调用xpath进行解析
r_list = parseHtml.xpath('//title[@lang="en"]')
- 只要调用了xpath,则结果一定是列表
- 示例+练习
from lxml import etree html = """<div class="wrapper"> <i class="iconfont icon-back" id="back"></i> <a href="/" id="channel">新浪社会</a> <ul id="nav"> <li><a href="http://domestic.firefox.sina.com/" title="国内">国内</a></li> <li><a href="http://world.firefox.sina.com/" title="国际">国际</a></li> <li><a href="http://mil.firefox.sina.com/" title="军事">军事</a></li> <li><a href="http://photo.firefox.sina.com/" title="图片">图片</a></li> <li><a href="http://society.firefox.sina.com/" title="社会">社会</a></li> <li><a href="http://ent.firefox.sina.com/" title="娱乐">娱乐</a></li> <li><a href="http://tech.firefox.sina.com/" title="科技">科技</a></li> <li><a href="http://sports.firefox.sina.com/" title="体育">体育</a></li> <li><a href="http://finance.firefox.sina.com/" title="财经">财经</a></li> <li><a href="http://auto.firefox.sina.com/" title="汽车">汽车</a></li> </ul> <i class="iconfont icon-liebiao" id="menu"></i> </div>""" # 1.构建解析对象 parseHtml = etree.HTML(html) # 2.解析对象调用 xpath 工具 # 获取所有a标签的 href属性值 r_list = parseHtml.xpath('//a/@href') #for i in r_list: # print(i) # 获取 / r_list = parseHtml.xpath( '//a[@id="channel"]/@href') #print(r_list) # 获取 非 / #r_list = parseHtml.xpath( # '//ul[@id="nav"]/li/a/@href') r_list = parseHtml.xpath( '//ul[@id="nav"]//a/@href') #print(r_list) # 获取所有<a>节点的文本内容 r_list = parseHtml.xpath('//a') # 得到的是元素对象,需要用 对象名.text 获取内容 #for i in r_list: # print(i.text) # 获取 新浪社会 r_list = parseHtml.xpath('//a[@id="channel"]') #for i in r_list: # print(i.text) # 获取非 新浪社会 的节点文本 r_list = parseHtml.xpath('//ul[@id="nav"]//a') for i in r_list: print(i.text)
4.案例 : 抓取百度贴吧帖子里面的图片
- 目标 : 抓贴吧中帖子图片
- 思路
- 获取贴吧主页URL : 美女吧 下一页:URL规律
- 获取美女吧中每个帖子的 URL
- 对每个帖子发请求,获取帖子里所有图片的URL
- 对图片URL发请求,以wb的方式写入本地文件
3.步骤 - 获取贴吧的URL
http://tieba.baidu.com/f? + 一堆的查询参数
pn = (page-1)*50
- 获取每个帖子的URL
http://tieba.baidu.com + /p/5869279412
//div[@class="t_con cleafix"]/div/div/div/a/@href
- 打开每个帖子,图片的URL
http://imgsrc.baidu.com/forum/w%3D580/sign=6e7036eac31b9d168ac79a69c3dfb4eb/9b23f21fbe096b63ee92fa6501338744eaf8ace5.jpg
xpath匹配: //img[@class="BDE_Image"]/@src
- 保存到本地
- ProxyBasicAuthHandler私密代理Handler处理器
-
密码管理器使用流程
- 创建密码管理器对象
pwd=urllib.request.HTTPPasswordMgrWithDefaultRealm()
- 创建密码管理器对象
-
添加私密代理用户名,密码,IP地址,端口信息
pwd.add_password(None,"IP:端口","用户名","密码")
-
urllib.request.ProxyBasicAuthHandler(密码管理器对象)
-
代码:
server = "114.67.228.126:16819" user = "309435365" password = "szayclhp" url = "http://www.baidu.com/" tarenaUrl = "http://code.tarena.com.cn/" # 密码管理器对象操作 pwd = urllib.request.HTTPPasswordMgrWithDefaultRealm() pwd.add_password(None,server,user,password) #pwd.add_password(None,tarenaUrl,"tarenacode","code_2013") # 创建处理器对象 proxy_handler = urllib.request.ProxyBasicAuthHandler(pwd) opener = urllib.request.build_opener(proxy_handler) # 发请求 req = urllib.request.Request(url) res = opener.open(req) html = res.read().decode("utf-8") print(html)
-