python 爬虫   数据抓取的三种方式

常用抽取网页数据的方式有三种:正则表达式、Beautiful Soup、lxml

1.正则表达式

正则表达式有个很大的缺点是难以构造、可读性差、不易适用未来网页的变化。

提取数据步骤:创建正则对象-->匹配查找-->提取数据保存

写一段伪代码:

import re
url = 'http://xxxx.com/sdffs'
html = download(url)
re.findall('正则表达式', html)

HTML 示例: 

<html>
<div><a href='www.baidu.com'>正则</a></div>
<div>111111</div>
<div><a href='www.baidu1.com'>正则1</a></div>
<div>222222</div>
<div><a href='www.baidu2.com'>正则2</a></div>
<div>333333</div>
<div><a href='www.baidu3.com'>正则3</a></div>
<div>444444</div>
</html>

例:提取所有a标签的文本

pattern = re.compile(r'<a.*?>(.*?)</a>', re.S)

a_text = re.findall(pattern, html)

知识点:

findall 返回的结果是列表套元组的形式

而search一般要加group(), groups(),

re.S 可以将正则的搜索域不再是一行,而是整个HTML字符串

.*? 非贪婪匹配    .*贪婪匹配

2.Beautiful Soup

这是一个非常流行的python模块。安装命令如下:

pip  install beautifulsoup4

使用此模块的第一步是将已下载的html内容解析为soup文档。因许多html网页格式不规范,Beautiful Soup可对其进行确定,将其调整为规范的html文件。

  比如说我们想抓取每个新闻的标题和链接,并将其组合为一个字典的结构打印出来。首先查看 HTML 源码确定新闻标题信息组织形式

可以目标信息存在于 em 标签下 a 标签内的文本和 href 属性中。可直接利用 requests 库构造请求,并用 BeautifulSoup 或者 lxml 进行解析。

方式一: requests + BeautifulSoup + select css选择器

# select method
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}url = 'http://news.qq.com/'Soup = BeautifulSoup(requests.get(url=url, headers=headers).text.encode("utf-8"), 'lxml')em = Soup.select('em[class="f14 l24"] a')
for i in em:title = i.get_text()link = i['href']print({'标题': title,
'链接': link})

很常规的处理方式.

方式二: requests + BeautifulSoup + find_all 进行信息提取

# find_all method
import requests
from bs4 import BeautifulSoup
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}url = 'http://news.qq.com/'Soup = BeautifulSoup(requests.get(url=url, headers=headers).text.encode("utf-8"), 'lxml')em = Soup.find_all('em', attrs={'class': 'f14 l24'})for i in em:title = i.a.get_text()link = i.a['href']print({'标题': title,'链接': link})

同样是 requests + BeautifulSoup 的爬虫组合,但在信息提取上采用了 find_all 的方式。

3.Lxml

Lxml是基于libxml2这一XML解析库的python封装。该模块使用c语言编写,解析速度比Beautiful Soup更快。
安装命令如下:

pip install lxml
pip install cssselect

如下代码,从html中获取class=country的ul标签下,li标签id=a的文本,获取li标签class=b的文本

# lxml/etree method
import requests
from lxml import etreeheaders = {    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}url = 'http://news.qq.com/'html = requests.get(url = url, headers = headers)con = etree.HTML(html.text)title = con.xpath('//em[@class="f14 l24"]/a/text()')link = con.xpath('//em[@class="f14 l24"]/a/@href')
for i in zip(title, link):print({'标题': i[0],
'链接': i[1]})

使用 lxml 库下的 etree 模块进行解析,然后使用 xpath 表达式进行信息提取,效率要略高于 BeautifulSoup + select 方法。这里对两个列表的组合采用了 zip 方法。

方式四: requests + lxml/html/fromstring + xpath 表达式

# lxml/html/fromstring method
import requests
import lxml.html as HTMLheaders = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/64.0.3282.119 Safari/537.36'}url = 'http://news.qq.com/'con = HTML.fromstring(requests.get(url = url, headers = headers).text)title = con.xpath('//em[@class="f14 l24"]/a/text()')link = con.xpath('//em[@class="f14 l24"]/a/@href')
for i in zip(title, link):print({'标题': i[0],'链接': i[1]})

跟方法三类似,只是在解析上使用了 lxml 库下的 html.fromstring 模块。

三种方式的比较

抓取方法 性能 使用难度 安装难度
正则表达式 困难 简单(内置模块)
Beautiful Soup 简单 简单(纯python)
Lxml 简单 相对困难

通常,lxml是抓取数据最好的选择,因为该方法既快速又健壮,而正则和Beautiful Soup只在某些特定场景下用。

参考:https://blog.csdn.net/apple9005/article/details/54930982

很多人觉得爬虫有点难以掌握,因为知识点太多,需要懂前端、需要python熟练、还需要懂数据库,更不用说正则表达式、XPath表达式这些。其实对于一个简单网页的数据抓取,不妨多尝试几种抓取方案,举一反三,也更能对python爬虫有较深的理解。长此以往,对于各类网页结构都有所涉猎,自然经验丰富,水到渠成。

希望对你有帮助。

python 爬虫 数据抓取的三种方式相关推荐

  1. java分页抓取数据_网页分页数据抓取的几种方式

    相信所有个人网站的站长都有抓取别人数据的经历吧,目前抓取别人网站数据的方式无非两种方式: 一.使用第三方工具,其中最著名的是火车头采集器,在此不做介绍. 二.自己写程序抓取,这种方式要求站长自己写程序 ...

  2. 爬虫数据抓取怎么弄?

    爬虫数据抓取是一种自动化的数据采集技术,可以快速.高效地从互联网上获取大量的数据.本文将介绍爬虫数据抓取的基本原理.常用的爬虫框架和工具.爬虫数据抓取的注意事项以及爬虫数据抓取的应用场景. 一.爬虫数 ...

  3. python爬网页数据用什么_初学者如何用“python爬虫”技术抓取网页数据?

    原标题:初学者如何用"python爬虫"技术抓取网页数据? 在当今社会,互联网上充斥着许多有用的数据.我们只需要耐心观察并添加一些技术手段即可获得大量有价值的数据.而这里的&quo ...

  4. Python爬虫采集抓取:Python3.x+Fiddler 采集抓取 APP 数据

    随着移动互联网的市场份额逐步扩大,手机 APP 已经占据我们的生活,以往的数据分析都借助于爬虫采集爬取网页数据进行分析,但是新兴的产品有的只有 APP,并没有网页端这对于想要提取数据的我们就遇到了些问 ...

  5. python爬虫定时抓取数据

    python爬虫定时抓取数据 from scrapy import cmdline import datetime import time def doSth(): # 把爬虫程序放在这个类中 shi ...

  6. Python爬虫实战---抓取图书馆借阅信息

    Python爬虫实战---抓取图书馆借阅信息 原创作品,引用请表明出处:Python爬虫实战---抓取图书馆借阅信息 前段时间在图书馆借了很多书,借得多了就容易忘记每本书的应还日期,老是担心自己会违约 ...

  7. python抓取视频违法吗,科学网—【python爬虫】抓取B站视频相关信息(一) - 管金昱的博文...

    昨天我在B站上写了这么一篇文章,但是被他们锁住了.无奈之下我复制到知乎上先保存起来 在这篇名为<三天学会用python进行简单地爬取B站网页视频数据>文章中我主要提到了两点在已知aid的情 ...

  8. python爬虫_抓取瓦片图片信息并将其拼接_以mapbar为例(适用交通工程类专业)

    python爬虫_抓取瓦片图片信息并将其拼接_以mapbar为例(适用交通工程类专业) 这次就以mapbar为例爬取道路交通拥堵情况 第一步,瓦片标号解析 第二步,拼url,然后下载 第三步,图片拼接 ...

  9. Python爬虫:抓取智联招聘岗位信息和要求(进阶版)

    本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理 以下文章来源于腾讯云 作者:王强 ( 想要学习Python?Python学习交流群 ...

最新文章

  1. c++ vector 中的坑
  2. HashSet、TreeSet和LinkedHashSet
  3. 天翼云认证--大纲介绍
  4. Shell(2)——shell里面的变量
  5. rowmapper_Spring Integration Jdbc RowMapper示例
  6. linux (阿里云 CentOS7) 中安装配置 RocketMQ
  7. mysql 多行 连续_mysql多表连续查询的问题
  8. python距离向量路由算法_互联网中常用路由协议,路由协议基础,一分钟了解下...
  9. python 线程池用法_python 线程池 ThreadPoolExecutor 的用法
  10. Windows 7 的一些使用技巧
  11. 《区块链》都火了两年多了,你还不知道它是什么?
  12. 阶段5 3.微服务项目【学成在线】_day04 页面静态化_08-freemarker基础-空值处理
  13. MySQL 8.0.12 基于Windows 安装教程
  14. 多开2000人QQ群技术是骗人的,完全不可行,你当腾讯技术是菜鸟?
  15. 修改Android 模拟器IMEI
  16. PS 在PS中如何等比例放大缩小图片
  17. 经方的魅力第二版》读书摘录
  18. 【system verilog】继续探究IC前端仿真中的“时间”,timescale,timeunit/timeprecision设置
  19. 读书笔记-只有偏执狂才能生存
  20. QT Designer + VS Code + PyQt5 安装教程

热门文章

  1. 前端解决粘贴过来的东西不触发键盘事件@令狐张豪
  2. 家用监控百科:什么是4K摄像机,4K摄像模组是什么意思
  3. 做小程序平台比开网店更挣钱吗?
  4. Git 版本管理之git神器查看commit的信息
  5. 葵花宝典 先要练功,必先自宫(横扫职场的葵花宝典)
  6. 我关于搜狗输入法的用户体验描述
  7. H5小游戏和小游戏之间存在什么技术差别?
  8. 受益良多的21个小故事
  9. 端口被占用—80端口被占用(结束被占用的端口),恢复端口
  10. 免疫抑制剂、拮抗剂、细胞因子抑制剂