转载请注明出处https://www.cnblogs.com/alexlee666/p/10180519.html,谢谢! 文中图片来自于我的简书博客。

一、 爬虫用途和本质:

网络爬虫顾名思义即模仿?️在网络上爬取数据,网络爬虫的本质是一段自动抓取网页信息的计算机程序。爬虫实现方式:模仿浏览器访问互联网的过程,下载指定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:分析感兴趣的、有价值的数据

工作流程如下图所示:


四、常用的爬虫框架:

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

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-2中的五星红旗,大图)并保存到本地目录。

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

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

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

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

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

1. 使用requests下载网页数据

2. 使用beautifulsoup解析网页数据

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


代码内容:


import requestsimport urllib.requestfrom bs4 import BeautifulSoup# 首页urlurl = '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()# 遍历每个countryGroupfor 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'%imgNameprint(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,还支持一些第三方的解析器:

因此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.cnblogs.com/alexlee666/p/10180519.html。谢谢支持!

转载于:https://www.cnblogs.com/alexlee666/p/10180519.html

爬虫系统基础框架 何时使用爬虫框架? requests库 + bs4来实现简单爬虫相关推荐

  1. 一起学爬虫——通过爬取豆瓣电影top250学习requests库的使用

    一起学爬虫--通过爬取豆瓣电影top250学习requests库的使用 学习一门技术最快的方式是做项目,在做项目的过程中对相关的技术查漏补缺. 本文通过爬取豆瓣top250电影学习python req ...

  2. python新闻爬虫系统的功能_基于Scrapy框架的Python新闻爬虫

    一.开发背景 Python作为数据处理方面的一把好手,近年来的热度不断增长.网络爬虫可以说是Python最具代表性的应用之一,那么通过网络爬虫来学习Python以及网络和数据处理的相关内容可以说是再合 ...

  3. 网络爬虫学习2 - 爬取网页的通用代码框架、HTTP协议、Requests库的各种方法

    网络爬虫MOOC学习打卡 - 第二天 文章目录 网络爬虫MOOC学习打卡 - 第二天 一.爬取网页的通用代码框架 1.理解requests库的异常 2.Respones类提供了一个方法 -- r.ra ...

  4. Python爬虫从入门到精通─第2课 Requests库讲解

    本教程所有源码下载链接:share.weiyun.com/5xmFeUO 密码:fzwh6g 本教程版权归作者GitOPEN所有,转载请征求作者同意 本教程首发于GitOPEN's Home Requ ...

  5. python的requests库的添加代理_python爬虫之requests库使用代理

    python爬虫之requests库使用代理 发布时间:2020-03-25 17:00:54 来源:亿速云 阅读:110 作者:小新 今天小编分享的是关于python爬虫的requests库使用代理 ...

  6. python爬虫requests实战_Python爬虫之requests库网络爬取简单实战

    实例1:直接爬取网页 实例2 : 构造headers,突破访问限制,模拟浏览器爬取网页 实例3 : 分析请求参数,构造请求参数爬取所需网页 实例4: 爬取图片 实例5: 分析请求参数,构造请求参数爬取 ...

  7. 爬虫笔记(一)——Requests库

    文章目录 写在前面 一.Requests库入门 1.Requests库的安装 (1)安装Requests库 (2)测试Requests库 2.Requests库的get()方法 (1) get()方法 ...

  8. 带你快速了解爬虫的原理及过程,并编写一个简单爬虫程序

    目录 前言 你应该知道什么是爬虫? 一.Scrapy的基本执行过程 二.Scrapy的实现 2.1Scrapy框架安装 2.2创建项目 (1)爬虫框架组件介绍 (2)控制台运行创建框架命令(spide ...

  9. 起点中文网爬虫实战requests库以及xpath的应用

    起点中文网爬虫实战requests库以及xpath的应用 知识梳理: 本次爬虫是一次简单的复习应用,需要用到requests库以及xpath. 在开始爬虫之前,首先需要导入这两个库 import re ...

最新文章

  1. 如何安装树莓派摄像头
  2. VCard 通信薄格式说明
  3. java 垃圾回收手动回收_Java垃圾回收(4)
  4. mybatis快速入门(三)
  5. Linux之ssh-copy-id命令
  6. 益智小游戏(app)
  7. 屏蔽五项网络功能 让XP系统极速狂飙
  8. 全球信息数据量陡增 大数据应用前景广阔
  9. Swift观察者模式
  10. android 401,Android HttpClient身份验证始终返回401代码
  11. 树莓派舵机控制c语言,第8章 树莓派控制伺服电机(舵机)
  12. IDEA清除Local History
  13. Python实现BF算法
  14. 国外问卷调查回答问题有什么技巧?
  15. 大数据单表查询mysql
  16. 计算机网络(第7版)第二章(应用层)知识点整理
  17. 毕业近一个月,工作近期的一些感受。
  18. github pages 一些需要注意的问题
  19. Android A2DP
  20. 【DTCC 2016】专家访谈:盖国强谈 DT 时代商业行为变化

热门文章

  1. 乖乖,想读给你的诗--[送别]
  2. [教你一招]设置Linux下中文显示
  3. python中的findall函数_关于Python正则表达式 findall函数问题详解
  4. 重生之——python与我不得不说的故事
  5. 怎样使html兼容各个浏览器,兼容各个浏览器的技巧
  6. Android全球定位系统GPS实时获取位置-刘宇
  7. 【1039】多边形三角剖分的最低得分
  8. 网页加入收藏夹的JS
  9. 用java编写一个简易功能画板_用Java语言编写一个简易画板
  10. TensorFlow的环境配置与安装