爬虫系统基础框架 & 何时使用爬虫框架?& requests库 + beautfilsoup来实现简单爬虫

转载请注明出处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,谢谢!

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,734评论 6 505
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,931评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,133评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,532评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,585评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,462评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,262评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,153评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,587评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,792评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,919评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,635评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,237评论 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,855评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,983评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,048评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,864评论 2 354