美文网首页python爬虫小记
爬虫系统基础框架 & 何时使用爬虫框架?& requests库

爬虫系统基础框架 & 何时使用爬虫框架?& requests库

作者: alexlee666 | 来源:发表于2018-12-26 16:18 被阅读0次
    转载请注明出处https://www.jianshu.com/p/88f920936edc,谢谢!

    一、 爬虫用途和本质:

    网络爬虫顾名思义即模仿🕷️在网络上爬取数据,网络爬虫的本质是一段自动抓取网页信息的计算机程序。爬虫实现方式:模仿浏览器访问互联网的过程,下载指定url网页的数据,然后解析并处理得到感兴趣的、有价值的数据。


    二、何时使用爬虫框架?

    针对不同的爬虫需求,爬虫的实现途径也不相同。对于比较大型或复杂的需求需要使用爬虫框架,因为框架便于管理和扩展等;而对于一般比较小型或简单的爬虫需求,那么使用框架就有点大材小用了,目前通常直接使用requests库 + bs4便可满足需求(requests与python request模块不是一回事,requests是一个基于urllib3的第三方库,bs4即python beautfilsoup组件)。


    三、 爬虫系统基础框架:

    一个爬虫系统的基础框架通常包含调度器scheduler、URL管理器manager、URL下载器downloader、URL解析器parser、应用application共5个模块。当然还可以根据任务的需求在基础框架的基础上添加扩展模块,比如监控模块、定时启动模块等。5个基础模块的功能如下:

    调度器scheduler:负责协调各模块

    url管理器manager:管理待爬取和已爬取的网页url

    下载器downloader:根据url去爬取对应的网页数据,将网页数据转换成一个字符串(html文档等),常用的下载器包括urllib3、requests等

    解析器parser:解析下载器下载得到的字符串,常用的解析器包括html.parser(Python自带的)、beautifulsoup(第三方插件)

    应用程序application:分析感兴趣的、有价值的数据

    工作流程如下图所示:

    图3-1. 简单爬虫框架执行流程.jpg

    四、常用的爬虫框架:

    前面已经提到过,爬虫框架适用于比较大型或复杂需求的爬虫,因为框架便于管理和扩展等。目前常用的几种爬虫框架包括:

    Scrapy框架

    PySpider框架

    Crawley框架

    Portia框架

    Newspaper框架

    尤其Scrapy框架和PySpider框架是比较受欢迎的爬虫框架。

    Scrapy框架官方:https://scrapy.org/

    PySpider框架官方:http://docs.pyspider.org


    五、requests库 + bs4来实现简单爬虫

    下面使用requests库 + bs4来实现简单爬虫并附上源码:

    5.1 先明确要爬取的目标数据:

    http://country.911cha.com/首页如下图所示:

    图5-1. 国家地区查询首页.png

    查询‘中国’的页面(以中国为例)如下图所示:


    图5-2. 中国国旗.png

    要爬取的目标数据:各国对应页面的国旗图片(如图5-2中的五星红旗,大图)并保存到本地目录。

    5.2 查看网页源码-分析图片所在的路径:

    step 1. 要爬取国家A的国旗,首先需要知道国家A对应的url,分析“国家地区查询首页http://country.911cha.com/”的源码可知,国家A的url保存在图5-3所示的位置(比如中国就是CHN.html):

    图5-3. 各国家的url位置.png

    step 2. 获取到国家A的url后就可以使用下载器requests来爬取网页内容了,但是要获取网页内容中的国旗图片还需要知道该图片在该网页内容中所在的位置。分析国家A对应的网页(以中国为例)发现,国旗图片的位置如图5-4所示(选中的那行):

    图5-4. 国旗图片所在的位置.png

    ⚠️:图5-4中的simg/199.gif是另一个小图(位于蓝色字体国家名的下方),非目标图片。

    到目前为止,就已经知道了国家A对应的url和国家A页面中国旗图片所在的位置,接下来就可以编写代码完成如下工作:

    1. 使用requests下载网页数据

    2. 使用beautifulsoup解析网页数据

    3. 使用urllib根据指定的图片路径和本地保存路径下载图片


    代码内容:

    
    import requests
    
    import urllib.request
    
    from bs4 import BeautifulSoup
    
    # 首页url
    
    url = 'http://country.911cha.com/'
    
    # requests下载器下载主页数据
    
    html = requests.get(url)
    
    # beautifulsoup解析主页数据
    
    soup = BeautifulSoup(html.text, "lxml")
    
    # 定位到‘ul’-无序列表(其中每个ul标签都包含了一个countryGroup,比如图5-1中的A组(按国家名拼音排序))
    
    countries = soup.find_all('ul', class_="l4 pt8 pb8")
    
    # 创建一个空list,里面元素是(imgUrl, imgName)
    
    html_countryName_Arr = list()
    
    # 遍历每个countryGroup
    
    for countryGroup in countries:
    
        # 遍历countryGroup中的每个国家
    
        for country in countryGroup.children:
    
           # 这里遍历的原因是一个国家对应一个list:  <li><a href="ECU.html" target="_blank" class="f14">厄瓜多尔</a></li>        
    
            for x in country:
    
                # 读取其中的href和text内容并添加到 html_countryName_Arr中
    
                html_countryName_Arr.append((x.get("href"), x.text))
    
    # 逐个构建每个国家对应的url和image下载路径
    
    for name_html in html_countryName_Arr:
    
        print("(name, html): " + str(name_html))
    
        countryUrl = url + name_html[0]
    
        countryHtml = requests.get(countryUrl)
    
        countrySoup = BeautifulSoup(countryHtml.text, "lxml")
    
        # 查找每个国家页面中的img标签
    
        for imgTag in countrySoup.find_all('img'):
    
            # 定位国旗图片的标签
    
            if 'alt' in imgTag.attrs and 'align' in imgTag.attrs:
    
                if '国旗' in imgTag.get("alt"):
    
                    imgName = imgTag.get("alt")
    
                    imgSourceUrl = '%s%s' % (url, imgTag.get("src"))
    
                    print(imgSourceUrl)
    
                    imgSavePath = '/Users/ycaha/PYTHON_LEARNING/nationFlags/%s.jpg'%imgName
    
                    print(imgSavePath)
    
                    # 下载国旗图片到本地路径
    
                    urllib.request.urlretrieve(imgSourceUrl, imgSavePath)
    
    

    代码分析:

    requests:下载器,html = requests.get(url)根据url下载网页数据;type(html)是<class 'requests.models.Response'>

    BeautifulSoup:解析器,BeautifulSoup(html.text, "lxml")创建<class 'bs4.BeautifulSoup'>实例;其中html.text是获取response的内容,数据格式为string,查看html.text方法如下:

    def text(self):
      """Content of the response, in unicode... """
    

    BeautifulSoup支持Python标准库中的HTML解析器html.parser,还支持一些第三方的解析器:

    图5-5. beautifulsoup支持的解析器种类.png

    因此BeautifulSoup(html.text, "lxml")的功能是:使用lxml解析器来解析html文本,并返回beautifulsoup实例,该实例是指定url网页数据的另一种表现形式,接下来可以通过分析该实例的属性attributes来获取所需要的数据内容。

    if 'alt' in imgTag.attrs and 'align' in imgTag.attrs:*
                if '国旗' in imgTag.get("alt"):*
                    imgName = imgTag.get("alt")*
                    imgSourceUrl = '%s%s' % (url, imgTag.get("src"))*
    

    这段代码用来定位属性alt包含‘国旗’的图片并将其下载到本地路径。通过这种if条件定位国旗图片的原因在于国旗图片所在的标签内容为:
    <p >
    <img src="bimg/199.gif" alt="中国国旗" align="right" class="pl8 pb8" /><strong ><font class="blue f24" >中国</font></strong>
    </p >
    soup.find_all('img')用来寻找html中所有标签为img对象,再寻找img对象中包含属性alt的img对象,再寻找属性alt中包含‘国旗’的img对象,最后使用urllib.request.urlretrieve(imgpath, savepath)将符合条件的图片下载到本地。


    水平有限,有错误还请大家指正!转载请注明出处,https://www.jianshu.com/p/88f920936edc,谢谢!

    相关文章

      网友评论

        本文标题:爬虫系统基础框架 & 何时使用爬虫框架?& requests库

        本文链接:https://www.haomeiwen.com/subject/vxohlqtx.html