关于网页爬虫:爬虫基本功就这么点

37次阅读

共计 2880 个字符,预计需要花费 8 分钟才能阅读完成。

文章分三个个局部

  1. 两个爬虫库 requests 和 selenium 如何应用
  2. html 解析库 BeautifulSoup 如何应用
  3. 动静加载的网页数据用 requests 怎么抓

两个爬虫库

requests

假如 windows 下装置好了 python 和 pip。
上面用 pip 装置爬虫库 requests

如果提醒 pip 版本低,不倡议降级,降级后可能 python 自身版本低,导致 pip 指令报错。

进入 Python 命令行验证 requests 库是否可能应用

看到 import requests 和 requests.get 函数都没有报错,阐明装置胜利能够开发咱们的第一个爬虫程序了!
将代码文件命名为 test.py,用 IDEL 关上。

最简略的爬虫就这么几行!

  1. 引入 requests 库,
  2. 用 get 函数拜访对应地址,
  3. 断定是否抓取胜利的状态,r.text 打印出抓取的数据。

而后菜单栏点击 Run->Run Module 会弹出 Python 的命令行窗口,并且返回后果。咱们拜访的是腾讯公布新冠肺炎疫情的地址

如果没有 IDEL,间接 cmd 命令行运行依照上面执行

selenium

selenium 库会启动浏览器,用浏览器拜访地址获取数据。上面咱们演示用 selenium 抓取网页,并解析爬取的 html 数据中的信息。先装置 selenium

接下来装置解析 html 须要的 bs4 和 lxml。
装置 bs4

装置 lxml

要确保 windows 环境变量 path 的目录下有 chromedriver

我 d 盘的 instantclient_12_2 曾经加到 path 里了。所以 chromedriver 解压到这个目录。chromedriver 不同的版本对应 Chrome 浏览器的不同版本,开始我下载的 chromedriver 对应 Chrome 浏览器的版本是 71-75(图中最上面的),我的浏览器版本是 80 所以从新下载了一个才好使。
代码如下

Python 执行过程中会弹出

浏览器也主动启动,拜访指标地址

IDEL 打印后果如下

HTML 解析库 BeautifulSoup

selenium 例子中爬取数据后应用 BeautifulSoup 库对 html 进行解析,提取了感兴趣的局部。如果不解析,抓取的就是一整个 html 数据,有时也是 xml 数据,xml 数据对标签的解析和 html 是一样的情理,两者都是 <tag> 来辨别数据的。这种格局的数据结构一个页面一个样子,解析起来很麻烦。BeautifulSoup 提供了弱小的解析性能,能够帮忙咱们省去不少麻烦。
应用之前装置 BeautifulSoup 和 lxml。
首先代码要引入这个库(参考下面 selenium 库代码)

from bs4 import BeautifulSoup  

而后,抓取

r = request.get(url)      
r.encoding='utf8'  
html=r.read() #urlopen 获取的内容都在 html 中  
mysoup=BeautifulSoup(html, 'lxml') #html 的信息都在 mysoup 中了   

假如咱们对 html 中的如下局部数据感兴趣

<data>  
        <day>20200214</day>  
        <id>1</id>  
        <rank>11</rank>  
        <name> 张三 </name>  
    </data>  
    <data>  
        <day>20200214</day>  
        <id>4</id>  
        <rank>17</rank>  
        <name> 李斯 </name>  
    </data>  

首先要找到 tag 标签为 <data> 的数据,而这类数据不止一条,咱们以两条为例。那么须要用到 beautifulsoup 的 find_all 函数,返回的后果应该是两个 <data> 数据。当解决每一个 <data> 数据时,外面的 <id><name> 等标签都是惟一的,这时应用 find 函数。

mysoup=BeautifulSoup(html, 'lxml')    
data_list=mysoup.find_all('data')  
for data in data_list:#list 应该有两个元素  
    day = data.find('day').get_text() #get_text 是获取字符串,能够用.string 代替  
    id = data.find('id').get_text()  
    rank = data.find('rank').get_text()  
    name = data.find('name').get_text()  
    #print name  能够 print 测试解析后果  

这是 beautifulsoup 最简略的用法,find 和 find_all 不仅能够依照标签的名字定位元素,还能够依照 class,style 等各种属性,以及文本内容 text 作为条件来查找你感兴趣的内容,十分弱小。

requests 库如何抓取网页的动静加载数据

还是以新冠肺炎的疫情统计网页为例。本文结尾 requests 例子最初打印的后果外面只有题目、栏目名称之类的,没有累计确诊、累计死亡等等的数据。因为这个页面的数据是动静加载下来的,不是动态的 html 页面。须要依照我下面写的步骤来获取数据,要害是取得 URL 和对应参数 formdata。上面以火狐浏览器讲讲如何取得这两个数据。
肺炎页面右键,呈现的菜单抉择查看元素。

点击上图红色箭头网络选项,而后刷新页面。如下,

这里会呈现很多网络传输记录,察看最右侧红框“大小”那列,这列示意这个 http 申请传输的数据量大小,动静加载的数据个别数据量会比其它页面元素的传输大,119kb 相比其它按字节计算的算是很大的数据了,当然网页的装璜图片有的也很大,这个须要依照文件类型那列来甄别。

url 带参数

而后点击域名列对应那行,如下

能够在音讯头中看见申请网址,url 的尾部问号前面曾经把参数写上了。
途中 url 解释,name 是 disease_h5,callback 是页面回调函数,咱们不须要有回调动作,所以设置为空,_对应的是工夫戳(Python 很容易取得工夫戳的),因为查问肺炎患者数量和工夫是严密相干的。
咱们如果应用带参数的 URL,那么就用

url='网址 /g2/getOnsInfo?name=disease_h5&callback=&_=%d'%int(stamp*1000)     
requests.get(url)   

url 和参数拆散

点击参数能够看见 url 对应的参数

如果应用参数和 url 拆散的模式那么
那么就这样

url="网址 /g2/getOnsInfo"  

formdata = {'name': 'disease_h5',   
'callback': '','_': 以后工夫戳    
}    

requests.get(url, formdata)  

找 url 和参数须要急躁剖析,能力正确甄别 url 和参数的含意,进行正确的编程实现。参数是否能够空,是否能够硬编码写死,是否有特殊要求,比拟依赖教训。

总结

学完本文,浏览爬虫代码就很容易了,所有代码都是为了胜利 get 到 url 做的筹备以及抓到数据之后的解析而已。
有的 url 很简略,返回一个.dat 文件,外面间接就是 json 格局的数据。有的须要设置大量参数,能力取得,而且取得的是 html 格局的,须要解析能力提取数据。
爬到的数据能够存入数据库,写入文件,也能够现抓现展现不存储。

正文完
 0