Python入门爬虫必知的两套解析方法和四种爬虫实现方式[亲测有效]

Python入门爬虫必知的两套解析方法和四种爬虫实现方式[亲测有效]一般而言,基础爬虫的两大请求库 urllib 和 requests 中 requests 通常为大多数人所钟爱,当然 urllib 也功能齐全。

欢迎大家来到IT世界,在知识的湖畔探索吧!

对于大多数零基础入门Python的朋友而言,爬虫绝对是学习 python 的最好的起手和入门方式。

因为爬虫思维模式固定,编程模式也相对简单,多线程、进程模型成熟稳定。爬虫是一个典型的多任务处理场景,请求页面时会有较长的延迟,总体来说更多的是等待。多线程或进程会更优化程序效率,提升整个系统下载和分析能力。一般在细节处理上积累一些经验都可以成功入门。

本文针对某一网页对 python 基础爬虫的两大解析库( BeautifulSoup 和 lxml )和几种信息提取实现方法进行分析。

基础爬虫的固定模式

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

我个人喜欢用的爬虫组合工具是:

requests + BeautifulSoup

requests + lxml

(想了解更多的Python爬虫知识,记得看文末哦!)

Python入门爬虫必知的两套解析方法和四种爬虫实现方式[亲测有效]

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

以搜狐新闻首页的新闻信息抓取为例。

首页外观如下:

比如说我们想抓取每个新闻的标题和链接,并将其组合为一个字典的结构打印出来。首先查看 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
 
    })

欢迎大家来到IT世界,在知识的湖畔探索吧!

欢迎大家来到IT世界,在知识的湖畔探索吧!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
 
    })
欢迎大家来到IT世界,在知识的湖畔探索吧!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 的方式。

方法三: 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]
 
    })
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 方法。

方法四: 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]
 
    })
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熟练、还需要懂数据库,更不用说正则表达式、XPath表达式这些。其实对于一个简单网页的数据抓取,不妨多尝试几种抓取方案,举一反三,也更能对python爬虫有较深的理解。长此以往,对于各类网页结构都有所涉猎,自然经验丰富,水到渠成。

Python入门爬虫必知的两套解析方法和四种爬虫实现方式[亲测有效]

领取方式:

转发本文,私信回复:资料,获取全套Python零基础资料。

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/22947.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们YX

mu99908888

在线咨询: 微信交谈

邮件:itzsgw@126.com

工作时间:时刻准备着!

关注微信