一文看懂Python 爬虫 进阶(二)
文章目录
- 上一篇文章简单的介绍了简单的爬虫程序的编写逻辑和运行
再次回顾爬取网站思路
1、先确定是否为动态加载网站
2、找URL规律
3、正则表达式
4、定义程序框架,补全并测试代码
- 这里我们把上次的获取页面信息和解析页面的用流程简洁的方法写一遍.
requests模块
(重要)
安装
(两个系统,两个版本)
- Linux
sudo pip3 install requests
- Windows
# 方法一
进入cmd命令行 :python -m pip install requests
# 方法二
右键管理员进入cmd命令行 :pip install requests
常用方法
requests.get()
- 作用
# 向网站发起请求,并获取响应对象
res = requests.get(url,headers=headers)
- 参数
1、url :需要抓取的URL地址
2、headers : 请求头
3、timeout : 超时时间,超过时间会抛出异常
- 响应对象(res)属性
1、encoding :响应字符编码
res.encoding = 'utf-8'
2、text :字符串
3、content :字节流
4、status_code :HTTP响应码
5、url :实际数据的URL地址
- 非结构化数据保存
with open('xxx.jpg','wb') as f:
f.write(res.content)
示例
保存詹姆斯图片到本地
import requests
url='https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1564223687471&di=da6eaa666376518c41fd637831f87de9&imgtype=0&src=http%3A%2F%2Fp0.ifengimg.com%2Fpmop%2F2017%2F1020%2FF0D62144382C1E053A011F578D3135EB6B11F740_size730_w3016_h1911.jpeg'
headers = {'User-Agent':'Mozilla/5.0'}
# 获取响应内容bytes
html = requests.get(url,headers=headers).content
# 写文件
with open('詹姆斯.jpg','wb') as f:
f.write(html)
Chrome浏览器安装插件
(主要是为了用这个XPATH工具)
- 安装方法
1、把下载的相关插件(对应操作系统浏览器)后缀改为 .zip
2、打开Chrome浏览器 -> 右上角设置 -> 更多工具 -> 扩展程序 -> 点开开发者模式
3、把相关插件 拖拽 到浏览器中,释放鼠标即可安装
- 需要安装插件
1、Xpath Helper: 轻松获取HTML元素的xPath路径
2、JsonView: 格式化输出json格式数据(后面用的到,这里先装上)
xpath解析
(很强大,刚开始用的时候可能觉得没有正则好用,多用多匹配会发现真的好用)
- 定义
XPath即为XML路径语言,它是一种用来确定XML文档中某部分位置的语言,同样适用于HTML文档的检索
- 示例HTML代码
<ul class="book_list">
<li>
<title class="book_001">Harry Potter</title>
<author>J K. Rowling</author>
<year>2005</year>
<price>69.99</price>
</li>
<li>
<title class="book_002">Avengers: Endgame</title>
<author>Russo</author>
<year>2019</year>
<price>49.99</price>
</li>
</ul>
- 匹配演示
1、查找所有的li节点
//li
2、查找li节点下的title子节点中,class属性值为'book_001'的节点
//li/title[@class="book_001"]
3、查找li节点下所有title节点的,class属性的值
//li//title/@class
# 只要涉及到条件,加 []
# 只要获取属性值,加 @
- 选取节点
1、// :从所有节点中查找(包括子节点和后代节点)
2、@ :获取属性值
# 使用场景1(属性值作为条件)
//div[@class="movie"]
# 使用场景2(直接获取属性值)
//div/a/@src
- 匹配多路径(或)
xpath表达式1 | xpath表达式2 | xpath表达式3
- 常用函数
1、contains() :匹配属性值中包含某些字符串节点
# 查找class属性值中包含"book_"的title节点
//title[contains(@class,"book_")]
2、text() :获取节点的文本内容
# 查找所有书籍的名称
//ul[@class="book_list"]/li/title/text()
例子:
匹配页面所有的dd节点
lxml解析库
- 安装
sudo pip3 install lxml
- 使用流程
1、导模块
from lxml import etree
2、创建解析对象
parse_html = etree.HTML(html)
3、解析对象调用xpath
r_list = parse_html.xpath('xpath表达式')
- 练习(我把页面在文件里简单的写了一遍,一个很简单的页面,只是为了运用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>'''
# 创建解析对象
parseHtml = etree.HTML(html)
# 调用xpath返回结束,text()为文本内容
rList = parseHtml.xpath('//a/text()')
#print(rList)
# 提取所有的href的属性值
r2 = parseHtml.xpath('//a/@href')
#print(r2)
# 提取所有href的值,不包括 /
r3 = parseHtml.xpath('//ul[@id="nav"]/li/a/@href')
#print(r3)
# 获取 图片、军事、...,不包括新浪社会
r4 = parseHtml.xpath('//ul[@id="nav"]/li/a/text()')
for r in r4:
print(r)
- 看到这里 ,恭喜你,你已经可以分析爬取一些简单的静态网站了,注意!这里指的是简单的静态网站,后面会跟大家一起爬取一些动态的网站