Python最简单爬虫程序---百度导航条

网络爬虫:

       网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的称为网页追逐者),是一种按照一定的规则,自动地抓取万维网信息的程序或者脚本。

爬虫流程:

     要把信息从网页上抓取下来,并经过一定的清洗、分析,最后得到我们预期的结果,需要有以下几个步骤:

  1. 模拟请求:指的是让爬虫程序模拟成一个普通的网站访问者,去请求网站生成相应的网页
  2. 下载网页:下载网页后才能让爬虫程序对网页的内容进行进一步的清洗、分析等操作
  3. 解析网页:指的是对下载的网页内容按照一定的规则进行清洗、分析、组合等
  4. 输出结果:让爬虫程序对网页处理后生成预期的结果

    这里要先说明一下:

    “下载网页”需要用到python的requests库,”解析网页“需要用到BeautifulSoup4库。可以提前下载安装。

    这两个库的具体使用会在后续的文章中详细描述。

爬虫思路:

  1. 分析网页。

  • 用谷歌浏览器打开我们要爬的网页,比如我们第一个要爬的是百度的导航条,那就进入百度首页。
  • 按F12,或点击浏览器右上角的”更多工具“ - ”开发者工具“,进入开发者模式,页面如下:  

    Python最简单爬虫程序---百度导航条_第1张图片

  • 接着选中开发者模式界面中获取网页元素代码的工具,移动到右上角的导航条中,并点击一下。就会发现开发者模式界面中定位到了导航条所在的html代码。

Python最简单爬虫程序---百度导航条_第2张图片

  • 点击代码左侧的黑色小三角形,展开代码如下:Python最简单爬虫程序---百度导航条_第3张图片
  • 可以看到,我们所要的导航条信息就在这段代码里了。接下来,我们就可以用python来爬取了。分析网页。

   2. 下载网页

  • 首先我们定义一个下载网页的函数,比方叫 def downloadPage():
  • 前面我们提到了,要先模拟用户发起请求。在此之前,我们要先告诉python要爬的网站地址。
  • 然后我们用python提供的requests库中的get方法获取网页内容
  • 由于是一个函数,因此最后要将结果返回给调用的main函数

    具体代码如下:

def downloadPage():
    #url要用网站地址的全称,不可简写为www.baidu.com
    url = "https://www.baidu.com"
    #模拟网页的请求头,通用写法。(涉及到网络层面知识,这里不展开。)
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
    }
    #用get的方式,获取url里的内容  
    data = requests.get(url, headers=headers).content
    return data

   3. 解析网页

  • 首先我们定义一个解析网页的函数,比方叫 def parsePage(html): ,由于这个解析网页的函数需要用到前面已经下载的网页内容,所以这里需要把网页内容作为参数传给解析函数,解析函数才能进行下一步处理
  • 解析函数我们用到BeautifulSoup库,这个库提供了几种解析的机制,有html的,有lxml的等等,这里我们用到html的解析器,写法是:BeautifulSoup(html,"html.parser")
  • 在一开始我们通过开发者模式找到了百度导航条所在的代码,那我们就可以利用BeautifulSoup提供的find方法来定位,写法是:find('标签名', attrs={'id/class': 'id/class的值'})。标签名是指html的标签,比如div、a、span等。
  • 定位后我们还发现导航条名称是分布在多个a标签中的,所以我们需要遍历a标签,并提取其中的文本值,然后将值循环写入一个List中,方便我们后面输出。

   具体代码如下:

toolbar = []
def parse_html(html):
    soup = BeautifulSoup(html,"html.parser")
    detail = soup.find('div', attrs={'id': 'u1'}) #如果这个id获取不到结果,可以填它的上一级标签
    if detail != None:
        for bar in detail.find_all('a'):  #用find_all('a')方法可以快速找到所有的a标签
            name = bar.getText()    #获取a标签中的文本值          
            toolbar.append(name)    #每获取一个文本值就加入toolbar列表中,便于后续输出     
        return toolbar        #将解析结果返回给调用的函数

  4. 输出结果

  • 首先我们需要定义一个main函数,作为指挥作战部,来调用函数,传递参数,输出结果。
  • 接着我们需要在main函数中,调用下载网页的函数,并把下载后的网页传给解析函数进行解析
  • 最后把解析后返回的结果进行输出

   具体代码如下:

def main():
    handle = parse_html(downloadPage())
    if handle != None:
        for name in handle:
            print(name)

if __name__ == '__main__':
    main()

代码整合

  把思路连贯起来,将代码串接起来的结果如下:

import requests
from bs4 import BeautifulSoup

url = 'https://www.baidu.com'

def downloadPage(url):
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
    }
    data = requests.get(url, headers=headers).content
    return data

toolbar = []
def parse_html(html):
    soup = BeautifulSoup(html,"html.parser")
    detail = soup.find('div', attrs={'id': 'u1'})
    if detail != None:
        for bar in detail.find_all('a'):
            name = bar.getText()
            toolbar.append(name)
        return toolbar

def main():
    handle = parse_html(downloadPage(url))
    if handle != None:
        for name in handle:
            print(name)

if __name__ == '__main__':
    main()

 

你可能感兴趣的:(Python)