Python爬虫的两套解析方法和四种爬虫实现过程

作者:Python火火 时间:2022-07-07 03:40:11 

对于大多数朋友而言,爬虫绝对是学习 python 的最好的起手和入门方式。因为爬虫思维模式固定,编程模式也相对简单,一般在细节处理上积累一些经验都可以成功入门。本文想针对某一网页对  python 基础爬虫的两大解析库(  BeautifulSoup 和  lxml )和几种信息提取实现方法进行分析,以开  python 爬虫之初见。

基础爬虫的固定模式

笔者这里所谈的基础爬虫,指的是不需要处理像异步加载、验证码、代理等高阶爬虫技术的爬虫方法。一般而言,基础爬虫的两大请求库 urllib 和  requests 中  requests 通常为大多数人所钟爱,当然  urllib 也功能齐全。两大解析库  BeautifulSoup 因其强大的  HTML 文档解析功能而备受青睐,另一款解析库  lxml 在搭配  xpath 表达式的基础上也效率提高。就基础爬虫来说,两大请求库和两大解析库的组合方式可以依个人偏好来选择。

笔者喜欢用的爬虫组合工具是:

  • requests +  BeautifulSoup

  • requests +  lxml

同一网页爬虫的四种实现方式

笔者以腾讯新闻首页的新闻信息抓取为例。

首页外观如下:

Python爬虫的两套解析方法和四种爬虫实现过程 

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

Python爬虫的两套解析方法和四种爬虫实现过程 

可以目标信息存在于 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
  })


很常规的处理方式,抓取效果如下:


Python爬虫的两套解析方法和四种爬虫实现过程 


方式二: 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 的方式。效果如下:

Python爬虫的两套解析方法和四种爬虫实现过程 

方式三: requests +  lxml/etree +  xpath 表达式


# lxml/etree method
import requests
from lxml import etree
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/'
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 方法。python学习交流群:125240963效果如下:

Python爬虫的两套解析方法和四种爬虫实现过程 

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


# lxml/html/fromstring method
import requests
import lxml.html as HTML
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/'
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 模块。抓取效果如下:

Python爬虫的两套解析方法和四种爬虫实现过程 

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

总结

以上所述是小编给大家介绍的Python爬虫的两套解析方法和四种爬虫实现过程网站的支持!

来源:http://www.cnblogs.com/huohuohuo1/p/9338462.html

标签:python,爬虫,解析
0
投稿

猜你喜欢

  • Python读取HTML中的canvas并且以图片形式存入Word文档

    2022-09-03 04:50:33
  • javascript验证IP地址等验证例子

    2007-09-11 13:40:00
  • Python实现简单层次聚类算法以及可视化

    2023-09-04 00:16:21
  • Python实现列表拼接和去重的三种方式

    2021-05-02 23:43:54
  • python编程简单几行代码实现视频转换Gif示例

    2021-09-02 03:34:13
  • Pytorch中的backward()多个loss函数用法

    2023-11-12 00:19:21
  • Tensorflow 训练自己的数据集将数据直接导入到内存

    2023-08-18 14:30:14
  • linux下默认安装mysql数据库

    2011-03-08 09:24:00
  • python里使用正则表达式的组嵌套实例详解

    2021-05-09 18:11:34
  • python人工智能自定义求导tf_diffs详解

    2023-06-11 13:31:51
  • 图像替换新技术:状态域方法[译]

    2009-08-06 16:41:00
  • python中如何使用正则表达式的非贪婪模式示例

    2022-08-28 08:43:49
  • python根据路径导入模块的方法

    2021-10-23 14:27:38
  • python神经网络使用tensorflow构建长短时记忆LSTM

    2021-10-13 19:23:39
  • Python pip安装第三方库的攻略分享

    2023-02-15 07:53:26
  • XML简易教程之三

    2008-09-05 17:19:00
  • Python嵌入C/C++进行开发详解

    2024-01-02 06:39:48
  • 谈一谈基于python的面向对象编程基础

    2021-09-09 11:04:39
  • python datetime处理时间小结

    2022-11-21 01:38:15
  • Python3标准库glob文件名模式匹配的问题

    2021-08-29 14:00:23
  • asp之家 网络编程 m.aspxhome.com