Python学习教程:关于数据采集和解析的详细讲解

Python学习教程:数据采集和解析

通过上一个章节的讲解,我们已经了解到了开发一个爬虫需要做的工作以及一些常见的问题,下面我们给出一个爬虫开发相关技术的清单以及这些技术涉及到的标准库和第三方库,稍后我们会一一介绍这些内容。

  • 下载数据 - urllib / requests / aiohttp。
  • 解析数据 - re / lxml / beautifulsoup4 / pyquery。
  • 缓存和持久化 - pymysql / sqlalchemy / peewee/ redis / pymongo。
  • 生成数字签名 - hashlib。
  • 序列化和压缩 - pickle / json / zlib。
  • 调度器 - 多进程(multiprocessing) / 多线程(threading)。

HTML页面

<!DOCTYPE html>
<html>
	<head>
		<title>Home</title>
		<style type="text/css">
			/* 此处省略层叠样式表代码 */
		</style>
	</head>
	<body>
		<div class="wrapper">
			<header>
				<h1>Yoko's Kitchen</h1>
				<nav>
					<ul>
						<li><a href="" class="current">Home</a></li>
						<li><a href="">Classes</a></li>
						<li><a href="">Catering</a></li>
						<li><a href="">About</a></li>
						<li><a href="">Contact</a></li>
					</ul>
				</nav>
			</header>
			<section class="courses">
				<article>
					<figure>
						<img src="images/bok-choi.jpg" alt="Bok Choi" />
						<figcaption>Bok Choi</figcaption>
					</figure>
					<hgroup>
						<h2>Japanese Vegetarian</h2>
						<h3>Five week course in London</h3>
					</hgroup>
					<p>A five week introduction to traditional Japanese vegetarian meals, teaching you a selection of rice and noodle dishes.</p>
				</article> 
				<article>
					<figure>
						<img src="images/teriyaki.jpg" alt="Teriyaki sauce" />
						<figcaption>Teriyaki Sauce</figcaption>
					</figure>
					<hgroup>
						<h2>Sauces Masterclass</h2>
						<h3>One day workshop</h3>
					</hgroup>
					<p>An intensive one-day course looking at how to create the most delicious sauces for use in a range of Japanese cookery.</p>
				</article> 
			</section>
			<aside>
				<section class="popular-recipes">
					<h2>Popular Recipes</h2>
					<a href="">Yakitori (grilled chicken)</a>
					<a href="">Tsukune (minced chicken patties)</a>
					<a href="">Okonomiyaki (savory pancakes)</a>
					<a href="">Mizutaki (chicken stew)</a>
				</section>
				<section class="contact-details">
					<h2>Contact</h2>
					<p>Yoko's Kitchen<br>
						27 Redchurch Street<br>
						Shoreditch<br>
						London E2 7DP</p>
				</section>
			</aside>
			<footer>
				 2011 Yoko's Kitchen
			</footer>
		</div>
 <script>
 	// 此处省略JavaScript代码
 </script>
	</body>
</html>

如果你对上面的代码并不感到陌生,那么你一定知道HTML页面通常由三部分构成,分别是用来承载内容的Tag(标签)、负责渲染页面的CSS(层叠样式表)以及控制交互式行为的JavaScript。通常,我们可以在浏览器的右键菜单中通过“查看网页源代码”的方式获取网页的代码并了解页面的结构;当然,我们也可以通过浏览器提供的开发人员工具来了解更多的信息。

使用requests获取页面

  • GET请求和POST请求。
  • URL参数和请求头。
  • 复杂的POST请求(文件上传)。
  • 操作Cookie。
  • 设置代理服务器。

【说明】:关于requests的详细用法可以参考它的官方文档。

页面解析

几种解析方式的比较

Python学习教程:关于数据采集和解析的详细讲解
说明:BeautifulSoup可选的解析器包括:Python标准库(html.parser)、lxml的HTML解析器、lxml的XML解析器和html5lib。
使用正则表达式解析页面

如果你对正则表达式没有任何的概念,那么推荐先阅读《正则表达式30分钟入门教程》,然后再阅读我们之前讲解在Python中如何使用正则表达式一文。

XPath解析和lxml

XPath是在XML文档中查找信息的一种语法,它使用路径表达式来选取XML文档中的节点或者节点集。这里所说的XPath节点包括元素、属性、文本、命名空间、处理指令、注释、根节点等。

<?xml version="1.0" encoding="UTF-8"?>
<bookstore>
 <book>
 <title lang="eng">Harry Potter</title>
 <price>29.99</price>
 </book>
 <book>
 <title lang="eng">Learning XML</title>
 <price>39.95</price>
 </book>
</bookstore>

对于上面的XML文件,我们可以用如下所示的XPath语法获取文档中的节点。

Python学习教程:关于数据采集和解析的详细讲解
在使用XPath语法时,还可以使用XPath中的谓词。

Python学习教程:关于数据采集和解析的详细讲解
XPath还支持通配符用法,如下所示。

Python学习教程:关于数据采集和解析的详细讲解
如果要选取多个节点,可以使用如下所示的方法。

Python学习教程:关于数据采集和解析的详细讲解
【说明】:上面的例子来自于菜鸟教程网站上XPath教程,有兴趣的读者可以自行阅读原文。

当然,如果不理解或者不太熟悉XPath语法,可以在Chrome浏览器中按照如下所示的方法查看元素的XPath语法。

Python学习教程:关于数据采集和解析的详细讲解
BeautifulSoup的使用

BeautifulSoup是一个可以从HTML或XML文件中提取数据的Python库。它能够通过你喜欢的转换器实现惯用的文档导航、查找、修改文档的方式。

1.遍历文档树

  • 获取标签
  • 获取标签属性
  • 获取标签内容
  • 获取子(孙)节点
  • 获取父节点/祖先节点
  • 获取兄弟节点

2.搜索树节点

find / find_all
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': 'http://122.114.31.177:808'
 }
 base_url = 'https://www.zhihu.com/'
 seed_url = urljoin(base_url, 'explore')
 resp = requests.get(seed_url,
 headers=headers,
 proxies=proxies)
 soup = BeautifulSoup(resp.text, 'lxml')
 href_regex = re.compile(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()

欢迎朋友们补充交流!

版权声明:本文为qfluohao原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qfluohao/article/details/102608051

智能推荐

Linux系统的远程操作练习

目录 一、将虚拟机Ubuntu系统的网络连接设置为“桥接模式”,并配置Ubuntu的IP、网关参数 二、在win10系统下用putty登录ubuntu系统 三、VNC server VNC viewer 思考 一、将虚拟机Ubuntu系统的网络连接设置为“桥接模式”,并配置Ubuntu的IP、网关参数 1.打开虚拟机,进入设置 点击网络适配器,选择桥...

ORACLE----TimeStamp(时间戳)自动更新

之前对id的自增长进行了设置,原以为时间戳的更新也类似,使用序列之类的,但最终发现跟序列没半毛钱关系。触发器是肯定要用的,但编写脚本也是需要的。 (1)创建触发器 图2中,我们要选择事件(即例子中的INSERT,UPDATE),触发时间(即INSERT,UPDATE事件的前或后,例子中是before),列(例子中为MODIFIED_DATE,为TimeStamp类型),新旧值(为系统默认值OLD和...

数字图像处理:对数变换

设置窗口大小的函数: namedWindow("窗口名", 0); resizeWindow("窗口名", width, height);...

LeetCode(剑指offer-tree)-面试题26. 树的子结构

输入两棵二叉树A和B,判断B是不是A的子结构。(约定空树不是任意一个树的子结构) B是A的子结构, 即 A中有出现和B相同的结构和节点值。 例如: 树的遍历方式为:前序遍历 给定的树 A: 给定的树 B: 返回 true,因为 B 与 A 的一个子树拥有相同的结构和节点值。 示例 1: 示例 2: 限制: 题源链接:https://leetcode-cn.com/problems/shu-de-z...

大数据笔记14:Zebra项目分析与实施

第14天——Zebra项目分析与实施 第一部分 Zebra项目概述 一、Zebra项目介绍 二、日志数据结构分析 三、数据以| 分割后,每个数据项的含义 四、Zebra项目整体架构 (一)技术架构 (二)工程架构 五、Zebra业务说明 六、Zebra项目设计思想 第二部分 Zebra项目实施过程 一、创建Maven项目ZebraProject 二、zebra_jobtra...

猜你喜欢

solr

概述         Solr是基于Lucene(Solr版本基本也是随着Lucene走)开发的一个独立的企业级搜索应用服务器,它对外提供类似于Web-service的API接口.用户可以通过http请求,向搜索引擎服务器提交一定格式的XML文件,生成索引,也可以通过Http Get操作提出查找请求,并得到XML格式的返回结果.(网上有个solr教...

Paddle2.0-通过DCGAN实现人脸生成

Paddle2.0-通过DCGAN实现人脸图像 本教程将通过一个示例对DCGAN进行介绍。在向其展示许多真实人脸照片(数据集:Celeb-A Face)后,我们将训练一个生成对抗网络(GAN)来产生新人脸。本文将对该实现进行详尽的解释,并阐明此模型的工作方式和原因。并不需要过多专业知识,但是可能需要新手花一些时间来理解的模型训练的实际情况。为了节省时间,请尽量选择GPU进行训练。 1 简介 本项目...

winsocket 和 vmware ubuntu 通信,NAT 非端口映射

一、网络配置 1、NAT 虚拟网络配置 2、选择 NAT 3、查看ip 4、设置 VMnet8 ,ip自设,网关需要一致。 二、程序 1、WinSocketClient 2、LinuxSocketServer    ...

Mybatis 注解 @Many 一对多 传递多个参数问题

Mybatis 注解 @Many 一对多 传递多个参数问题 如果@Many调用的方法需要传递空值,那么就不写该参数值。 column 参数写法 :{@Param 名称 = column 字段名 , @Param 名称 = column 字段名 ...}以逗号隔开 示例:方法不重要,重要的是使用方式...

第8章 进程和程序:编写命令解释器sh

进程  在Unix术语中,一个可执行程序是一个机器指令及其数据的序列每一个进程是程序运行时的内存空间和设置。可以用ps命令查看进程。  每个进程都有一个唯一的进程id,所有者,大小以及其他属性  系统进程中的很大一部分是没用终端与之相连的,它们在系统启动时启动,而不是由用户在命令行输入。  内存可以看作是一个容纳内核和进程的空间。Unix中的内存分为系统空间...