Python爬⾍中的数据采集和分析
数据采集和解析
通过⼀⽂,我们已经了解到了开发⼀个爬⾍需要做的⼯作以及⼀些常见的问题,⾄此我们可以对爬⾍开发需要做的⼯作以及相关的技术做⼀个简单的汇总,这其中可能会有⼀些我们之前没有使⽤过的第三⽅库,不过别担⼼,这些内容我们稍后都会⼀⼀讲到。
1. 下载数据 - urllib / requests / aiohttp。
2. 解析数据 - re / lxml / beautifulsoup4(bs4)/ pyquery。
3. 缓存和持久化 - pymysql / sqlalchemy / peewee/ redis / pymongo。
4. ⽣成数字签名 - hashlib。
5. 序列化和压缩 - pickle / json / zlib。
6. 调度器 - 进程(multiprocessing) / 线程(threading) / 协程(coroutine)。
HTML页⾯分析
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>⾸页</title>
</head>
<body>
<h1>Hello, world!</h1>
<p>这是⼀个神奇的⽹站!</p>
<hr>
<div>
<h2>这是⼀个例⼦程序</h2>
<p>静夜思</p>
<p class="foo">床前明⽉光</p>
<p id="bar">疑似地上霜</p>
<p class="foo">举头望明⽉</p>
<div><a href="www.baidu"><p>低头思故乡</p></a></div>
</div>
<a class="foo" href="www.qq">腾讯⽹</a>
<img src="./img/pretty-girl.png" alt="美⼥">
<img src="./img/hellokitty.png" alt="凯蒂猫">
<img src="/static/img/pretty-girl.png" alt="美⼥">
<table>
<tr>
<th>姓名</th>
<th>上场时间</th>
<th>得分</th>
<th>篮板</th>
<th>助攻</th>
</tr>
</table>
</body>
</html>
如果你对上⾯的代码并不感到陌⽣,那么你⼀定知道HTML页⾯通常由三部分构成,分别是⽤来承载内容的Tag(标签)、负责渲染页⾯的CSS(层叠样式表)以及控制交互式⾏为的JavaScript。通常,我们可以在浏览器的右键菜单中通过“查看⽹页源代码”的⽅式获取⽹页的代码并了解页⾯的结构;当然,我们也可以通过浏览器提供的开发⼈员⼯具来了解⽹页更多的信息。
使⽤requests获取页⾯
1. GET请求和POST请求。
2. URL参数和请求头。
3. 复杂的POST请求(⽂件上传)。
4. 操作Cookie。
5. 设置代理服务器。
说明:关于requests的详细⽤法可以参考它的。
四种采集⽅式
四种采集⽅式的⽐较
抓取⽅法速度使⽤难度备注
正则表达式快困难
常⽤正则表达式在线正则表达式测试
lxml快⼀般需要安装C语⾔依赖库唯⼀⽀持XML的解析器
BeautifulSoup较快/较慢(取决于解析器)简单
PyQuery较快简单Python版的jQuery 说明:BeautifulSoup可选的解析器包括:Python标准库(html.parser)、lxml的HTML解析器、lxml的XML解析器和html5lib。使⽤正则表达式
如果你对正则表达式没有任何的概念,那么推荐先阅读,然后再阅读我们之前讲解在Python中如何使⽤正则表达式⼀⽂。
使⽤XPath和Lxml
BeautifulSoup的使⽤
BeautifulSoup是⼀个可以从HTML或XML⽂件中提取数据的Python库。它能够通过你喜欢的转换器实现惯⽤的⽂档导航、查、修改⽂档的⽅式。
1. 遍历⽂档树
1. 获取标签
2. 获取标签属性
3. 获取标签内容
4. 获取⼦(孙)节点
5. 获取⽗节点/祖先节点
6. 获取兄弟节点
2. 搜索树节点
1. find / find_all
2. select_one / select
说明:更多内容可以参考BeautifulSoup的。
PyQuery的使⽤
pyquery相当于jQuery的Python实现,可以⽤于解析HTML⽹页。实例 - 获取知乎发现上的问题链接
from urllib.parse import urljoin
import re
import requests
from bs4 import BeautifulSoup
def main():
headers = {'user-agent': 'Baiduspider'}
proxies = {
'http': '122.114.31.177:808'
}
base_url = 'www.zhihu/'
seed_url = urljoin(base_url, 'explore')
resp = (seed_url,
安卓在线解析jsonheaders=headers,
proxies=proxies)
soup = , 'lxml')
href_regex = repile(r'^/question')
link_set = set()
for a_tag in soup.find_all('a', {'href': href_regex}):
if 'href' in a_tag.attrs:
href = a_tag.attrs['href']
full_url = urljoin(base_url, href)
link_set.add(full_url)
print('Total %d question pages found.' % len(link_set))
if __name__ == '__main__':
main()

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。