Python 简单爬虫实例

405次阅读
没有评论

目录

摘要

1.确定爬取网页对象

1.1查看目标对应的源码

2.获取网页源代码

3.解析网页源码

结束


摘要

本文主要介绍使用python第三方库beautifulsoup及requests实现网页内容抓取,以百度首页为例,介绍如何从零开始介绍如何抓取指定网页中的内容。

1.确定爬取网页对象

爬虫的目的在于使用编程的手段将获取网页内容的工作进行自动化和高效化,例如可以通过每周爬取一次房源网站上的房价信息来掌握北京房价动态变化情况,爬虫在各个方面都有很大的实用价值。

下图为百度的首页,下面本文以爬取红框中的内容为例,介绍爬取网页内容的主要流程。

Python

网页的内容由html标签构成,爬取网页内容的核心思想就是首先获取整个网页的html文本,然后通过beautifulsoup将html文本解析成对象,通过查找指定的标签对象,能够获取标签对象的各个属性,包括标签内的文本信息。

1.1查看目标对应的源码

目前主流浏览器如谷歌浏览器(chrome)、火狐浏览器等都支持网页源代码查看功能,以谷歌浏览器为例,在网页目标区域点击鼠标右键->检查,就会弹出目标对应的源码,如下图所示。

Python

我们将”新闻”对应的源码详细展示如下

<a href=”http://news.baidu.com” name=”tj_trnews” class=”mnav”>新闻</a>

可以看出,”新闻”这个词为标签a的文本内容,而且这个标签a的class名称为mnav,后续我们查找标签时,查找class等于mnav的a标签能够获取这个符合查找内容的标签。

我们通过查看网页上的目标“新闻”的源代码,知道了目标的标签及其属性,接下来,我们首先要先获取整个网页的源代码

2.获取网页源代码

获取网页中指定目标首先需要获取整个网页的源码,这里使用python的第三方库requests来实现获取指定url返回的网页信息,通过url提交网页请求有两种方式,GET和POST,函数原型如下

requests.get(url,headers=headers,…) requests.post(url, data=payload,headers=headers,…)

其中最重要的参数为url,表示请求的网页网址,headers为可选参数,表示设置的请求头信息,post方法还有data参数,表示提交给服务器的参数信息。

事实上,我们使用requests请求网页实际上是模拟浏览器客户端发出请求,因此要以浏览器发出请求的各项参数信息为准,例如使用get还是post方法,需要提交什么参数,headers头部如何设置。目前许多网站都有反爬措施,例如最简单的通过检查提交的header头部字段来判断是否是浏览器访问。因此,我们通过requests提交的url请求应尽可能的与真实浏览器提交的请求保持一致,更进一步来讲,无论是通过requests或是浏览器提交url请求,殊途同归,最终都会按照HTTP协议的格式进行封装提交,而HTTP请求报文由请求行、请求头、请求正文构成。请求行即使用GET还是POST方法,请求头即headers参数信息。

因此,我们需要保证通过requests提交所以的方法以及headers参数与浏览器客户端提交的一致即可,同样我们通过在网页上右键->检查,选择Network选项卡,可以详细查看浏览器提交的url请求以及headers头部参数,如下图所示。

Python

根据上图信息,我们在程序中设置与上图一致的headers参数,并使用GET方法,部分代码如下

#coding=utf8

from bs4 import BeautifulSoup import requests

def swarm_test(): headers = {} #设置headers headers[“User-Agent”] = “Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30” headers[“Accept”] = “text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3” headers[“Accept-Language”] = “zh-CN,zh;q=0.9,en-US;q=0.8,en;q=0.7” headers[“Accept-Encoding”] = “gzip, deflate, br” headers[“Upgrade-Insecure-Requests”] = “1” try: url = ‘https://www.baidu.com’ #爬取的指定url req = requests.get(url, headers=headers)#使用get方法请求url,同时设置请求头headers html_content=req.text.encode(‘utf-8’) #将requests请求返回的网页文本保存到html_content变量中 fw=open(‘baidu.html’,’w’) fw.write(html_content) #将请求返回的网页数据保存到文件中 fw.close() except Exception as e: print “error:”,e

if __name__ == “__main__”: swarm_test()

我们requests.get请求返回的网页文本保存到文件中,截取部分网页文本如下图所示,由此可以确定确实已经获取了指定url的网页源码信息。

Python

3.解析网页源码

在成功获取网页源码后,由于requests返回的网页源码为字符串类型,即文本格式,有两种方式可以过滤提取网页源码的指定内容,正则表达式和第三方库Beautiful Soup,Beautiful Soup将复杂HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,同时实现了丰富的对html标签对象查找和访问的方法,是解析HTML文档的首选。

解析html文本的函数原型如下

soup = BeautifulSoup(text, ‘html.parser’)#text为待解析的文本,html.parser表示将text按照html解析成python对象

返回的soup对象事实上是一个树形结构的对象,我们可以调用对象的find或find_all方法查找指定类型的标签对象,举例说明:

a_object=soup.find_all(name=’a’,attrs={“class”:”mnav”})

上述代码为查找标签为a,并且class为mnav的标签对象,find_all为查找所有的满足条件的对象,返回一个对象列表,而find只返回一个满足查找条件的对象。

我们再次查看网页中指定目标的标签属性,如下图所示

Python

根据目标的网页源码信息,我们写出如下代码获取指定目标对象,并且打印输出对象的文本信息。

#coding=utf8 #author heaven #date 2019/9/29 #脚本描述 简单爬虫

from bs4 import BeautifulSoup import requests

def swarm_test(): headers = {} #设置headers headers[“User-Agent”] = “Mozilla/5.0 (Windows NT 5.2) AppleWebKit/534.30 (KHTML, like Gecko) Chrome/12.0.742.122 Safari/534.30” headers[“Accept”] = “text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8” headers[“Accept-Language”] = “zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3” headers[“Accept-Encoding”] = “gzip, deflate” headers[“Upgrade-Insecure-Requests”] = “1” try: url = ‘https://www.baidu.com’ #爬取的指定url req = requests.get(url, headers=headers)#使用get方法请求url,同时设置请求头headers html_content=req.text.encode(‘utf-8’) req.encoding=”utf-8″ #返回数据编码为utf-8 # fw=open(‘baidu.html’,’w’) # fw.write(html_content) # fw.close() soup = BeautifulSoup(req.text.encode(‘utf-8’), ‘html.parser’) #将requests返回的网页字符串解析成对象soup a_object_list=soup.find_all(name=’a’,attrs={“class”:”mnav”}) #查找标签为a,class为mnav的所有对象 for a_object in a_object_list: #遍历符合条件的a标签对象 text_content=a_object.text #提取a标签的文本 a_class=a_object[‘class’] #eg. 获取a标签的class属性值 print text_content #打印输出a标签中的文本内容 except Exception as e: print “error:”,e if __name__ == “__main__”: swarm_test()

运行该python脚本后,输出的信息如下图所示

Python

说明获取网页指定内容成功。

结束

本文以百度首页为例,介绍了如何从零开始,爬取指定网页的内容,爬取其他各种网页的内容均大同小异,万变不离其宗。另一方面,考虑到许多网站设有各种反爬机制,许多实际生产环境中爬虫往往比较复杂,且不具有通用性,需要对爬取目标进行特定分析,才能设计编写出正确的爬取方案。

相关资料

Beautiful Soup 4.2.0 文档

Python Requests 文档

 

 

 

 

神龙|纯净稳定代理IP免费测试>>>>>>>>天启|企业级代理IP免费测试>>>>>>>>IPIPGO|全球住宅代理IP免费测试

相关文章:

版权声明:Python教程2022-10-28发表,共计4171字。
新手QQ群:570568346,欢迎进群讨论 Python51学习