Python数据抓取(2) —简单网络爬虫的撰写
(一)使用Requests存储网页
Requests
是什么?网络资源(URLs)抓取套件
优点?
- 改善urllib2的缺点,让使用者以最简单的方式获取网络资源
- 可以使用REST操作(POST,PUT,GET,DELETE)存取网络资源
import requests
response = requests.get('http://blog.sina.com.cn/lm/stock/')
print(response.text)
模拟HTTP的GET方法存储网页,获取网页的内容,这时我们发现我们获取的结果是乱码,为什么呢?
- 我们所抓取网页是UTF8的,但是python在请求的时候,把它误判为不知道是什么编码,因此把这个编码显示为预设编码:ISO-8859-1
import requests
response = requests.get('http://blog.sina.com.cn/lm/stock/')
print(response.encoding)
显示结果为ISO-8859-1,所以我们要告诉python我们遇到的网页是utf8,下面代码改进如下,我们便可以获得一个简体中文的内容:
import requests
response = requests.get('http://blog.sina.com.cn/lm/stock/')
response.encoding = 'utf-8'
print(response.text)
现在我们还有一个问题,该如何把上面非结构化的数据转化为结构化的数据呢?—DOM TREE方法
(二)用BeautifulSoup解析网页
1.基础铺垫-DOM TREE
- 全称:Document Object Model Tree,它是一组API,可以跟网页的元素进行互动,使用BeautifulSoup就可以把网页变成一个DOM TREE,我们就可以根据DOM TREE的节点进行操作
- 上图的举例,最外面结构是html,是最上层的节点,下面一层是body,里面包含h1和a两个链接,这些就组成了DOM TREE的架构,我们就可以根据这个架构下的某些节点进行互动,我们可以取得h1里面的词,也可以取得a里面的词,这时候我们就可以把数据顺利提取出来;
2.BeautifulSoup范例
- 将网页读进BeautifulSoup中
from bs4 import BeautifulSoup
html_sample = '\
<html> \
<body> \
<h1 id="title">Hello World</h1> \
<a href="#" class="link">This is link1</a> \
<a href="# link2" class="link">This is link2</a> \
</body> \
</html> '
soup = BeautifulSoup(html_sample)
print(soup.text)
- 这里会显示警告信息,警告信息告诉我们这段代码没有使用到我们的剖析器,这时python会预测一个剖析器给我们,如果我们要避免这种警告的产生,我们可以在代码中指明
soup = BeautifulSoup(html_sample,'html.parser')
3.找出所有含有特定标签的HTML元素
另外需要考虑的是,即使我们可以利用BeautifulSoup将标签移除掉,但有时我们要抓取的一些内容还位于特殊的标签之中,我们该怎样把特殊标签,以及节点中的资料取出来?
- 使用select找出含有h1标签的元素
soup = BeautifulSoup(html_sample)
header = soup.select('h1')
print(header)
- 使用select找出含有a标签的元素
soup = BeautifulSoup(html_sample)
alink = soup.select('a')
print(alink)
下面我们实操一下:
from bs4 import BeautifulSoup
html_sample = '\
<html> \
<body> \
<h1 id="title">Hello World</h1> \
<a href="#" class="link">This is link1</a> \
<a href="# link2" class="link">This is link2</a> \
</body> \
</html> '
soup = BeautifulSoup(html_sample,'html.parser')
header = soup.select('h1')
print(header)
显示的结果为:
- 如何进一步把上面的文字解开?加上[0],可以去掉中括号,加.text可以把里面的文字取出来
print(header[0].text)
4.取得含有特定CSS属性的元素
除了标签以外,我们该怎样取得特定的元素?我们可以透过CSS的属性去取得里面的元素,CSS是网页的“化妆师”,透过这个化妆师,我们可以对网页进行点缀
(1)如何要抓取独立不重复的元素,可以加上id的修饰
- 使用select找出所有id为title的元素(id前面需加#)
alink = soup.select('#title')
print(alink)
(2)如果要抓取重复的元素,可以加上class的修饰
- 使用select找出所有class为link的元素(class前面需加 . )
soup = BeautifulSoup(html_sample)
for link in soup.select('.link'):
print(link)
5.取得含有特定CSS属性的元素
在网页的连接上,我们会用 a tag 去连接不同的网页,a tag 有一个属性就叫href,透过这个属性我们才能连接到不同的网页;
- 使用select找出所有a tag 的href连结
alinks = soup.select('a')
for link in alinks:
print(link['href'])
Python数据抓取(2) —简单网络爬虫的撰写的更多相关文章
- python数据抓取分析(python + mongodb)
分享点干货!!! Python数据抓取分析 编程模块:requests,lxml,pymongo,time,BeautifulSoup 首先获取所有产品的分类网址: def step(): try: ...
- Python数据抓取技术与实战 pdf
Python数据抓取技术与实战 目录 D11章Python基础1.1Python安装1.2安装pip1.3如何查看帮助1.4D1一个实例1.5文件操作1.6循环1.7异常1.8元组1.9列表1.10字 ...
- Python数据抓取(1) —数据处理前的准备
(一)数据抓取概要 为什么要学会抓取网络数据? 对公司或对自己有价值的数据,80%都不在本地的数据库,它们都散落在广大的网络数据,这些数据通常都伴随着网页的形式呈现,这样的数据我们称为非结构化数据 如 ...
- Python数据抓取_BeautifulSoup模块的使用
在数据抓取的过程中,我们往往都需要对数据进行处理 本篇文章我们主要来介绍python的HTML和XML的分析库 BeautifulSoup 的官方文档网站如下 https://www.crummy.c ...
- Python数据抓取(3) —抓取标题、时间及链接
本次分享,jacky将跟大家分享如何将第一财经文章中的标题.时间以及链接抓取出来 (一)观察元素抓取位置 网页的原始码很复杂,我们必须找到特殊的元素做抽取,怎么找到特殊的元素呢?使用开发者工具检视每篇 ...
- (转)ObjC利用正则表达式抓取网页内容(网络爬虫)
转自:http://www.cocoachina.com/bbs/read.php?tid=103813 *****boy]原创 2012年5月20日 在开发项目的过程,很多情况下我们需要利用互联网上 ...
- ObjC利用正则表达式抓取网页内容(网络爬虫)
本文转载至 http://www.cocoachina.com/bbs/read.php?tid=103813&fpage=63 在开发项目的过程,很多情况下我们需要利用互联网上的一些数据,在 ...
- 使用Puppeteer进行数据抓取(三)——简单的示例
本文以一个示例简单的介绍一下puppeteer的用法,我们的目的是:获取我博客上的文章的前十页的所有随笔的标题和链接.由于puppeteer本身是自动化chorme,因此这里我们的步骤和手动操作浏览器 ...
- python爬虫(一)_爬虫原理和数据抓取
本篇将开始介绍Python原理,更多内容请参考:Python学习指南 为什么要做爬虫 著名的革命家.思想家.政治家.战略家.社会改革的主要领导人物马云曾经在2015年提到由IT转到DT,何谓DT,DT ...
随机推荐
- Angular CDK Overlay 弹出覆盖物
为什么使用Overlay? Overlay中文翻译过来意思是覆盖物,它是Material Design components for Angular中针对弹出动态内容这一场景的封装,功能强大.使用方便 ...
- Django ORM相关的一些操作
一般操作 看专业的官网文档,做专业的程序员! 必知必会13条 <1> all(): 查询所有结果 <2> filter(**kwargs): 它包含了与所给筛选条件相匹配的对象 ...
- 用Lua的协程实现类似Unity协程的语句块
local co_time_tbl = {} setmetatable(co_time_tbl, { __len = function(o) for k, v in pairs(o) do count ...
- AOP与IOC区别
Spring核心知识 Spring是一个开源框架,Spring是于2003年兴起的一个轻量级的Java开发框架,由Rod Johnson在其著作Expert One-On-One J2EE Devel ...
- [Tarjan系列] 无向图e-DCC和v-DCC的缩点
上一篇讲了如何应用Tarjan算法求出e-DCC和v-DCC. 那么这一篇就是e-DCC和v-DCC的应用之一:缩点. 先讲e-DCC的缩点. 我们把每一个e-DCC都看成一个节点,把所有桥边(x,y ...
- 【shell脚本】字符串和数组的使用
字符串 可以使用单引号和双引号定义字符串变量但是单引号中不支持变量解析 #! /bin/bashusername="mayuan" str_1="hello ${user ...
- pytorch转onnx问题
Fail to export the model in PyTorch https://github.com/onnx/tutorials/blob/master/tutorials/PytorchA ...
- 理解 chroot
什么是 chroot chroot,即 change root directory (更改 root 目录).在 linux 系统中,系统默认的目录结构都是以 `/`,即是以根 (root) 开始的. ...
- 随意软连接/home/users目录导致环境变量消失后的事故
1 自己的用户zj下,把/home/zj 删除后用ln -s软连接其他目录,导致了当前用户的.bash_profile失效 2 解决思路 第一,删除软连接 rm -rf /home/zj 记住后面 ...
- curl命令的高级用法
curl命令 是一个利用URL规则在命令行下工作的文件传输工具.它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称curl为下载工具.作为一款强力工具,curl支持包括HTTP.HTTPS. ...