温馨提示×

温馨提示×

您好,登录后才能下订单哦!

密码登录×
登录注册×
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》

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

发布时间:2020-08-11 09:03:02 来源:ITPUB博客 阅读:212 作者:赵钰莹 栏目:编程语言

【本文转载自微信公众号数据科学家养成记,作者:louwill,转载授权请联系原作者】 

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

基础爬虫的固定模式

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


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

  • requests+BeautifulSoup

  • requests+lxml


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

    笔者以腾讯新闻首页的新闻信息抓取为例。
    首页外观如下:

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


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

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


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

  • 方式一:requests+BeautifulSoup+select# 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爬虫的两套解析方法和四种爬虫实现


    • 方式四: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爬虫有较深的理解。长此以往,对于各类网页结构都有所涉猎,自然经验丰富,水到渠成。

向AI问一下细节

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

AI