Python爬虫编程思想(7):实战案例:抓取博客文章列表

到现在为止,我们已经对网络爬虫涉及到的基本知识有了一个初步的了解。本文会编写一个简单的爬虫应用,以便让读者对爬虫有一个基本的认识。本节要编写的爬虫属于全网爬虫类别,但我们肯定不会抓取整个互联网的资源。所以本节会使用7个HTML文件来模拟互联网资源,并将这7个HTML文件放在本地的nginx服务器的虚拟目录,以便抓取这7个HTML文件。

全网爬虫要至少有一个入口点(一般是门户网站的首页),然后会用爬虫抓取这个入口点指向的页面,接下来会将该页面中所有链接节点(a节点)中href属性的值提取出来。这样会得到更多的Url,然后再用同样的方式抓取这些Url指向的HTML页面,再提取出这些HTML页面中a节点的href属性的值,然后再继续,直到所有的HTML页面都被分析完为止。只要任何一个HTML页面都是通过入口点可达的,使用这种方式就可以抓取所有的HTML页面。这很明显是一个递归过程,下面就用伪代码来描述这一递归过程。

从前面的描述可知,要实现一个全网爬虫,需要下面两个核心技术。

  • 下载Web资源(html、css、js、json)
  • 分析Web资源

假设下载资源通过download(url)函数完成,url是要下载的资源链接。download函数返回了网络资源的文本内容。analyse(html)函数用于分析Web资源,html是download函数的返回值,也就是下载的HTML代码。analyse函数返回一个列表类型的值,该返回值包含了HTML页面中所有的URL(a节点href属性值)。如果HTML代码中没有a节点,那么analyse函数返回空列表(长度为0的列表)。下面的drawler函数就是下载和分析HTML页面文件的函数,外部程序第1次调用crawler函数时传入的URL就是入口点HTML页面的链接。

def crawler(url)
{# 下载url指向的HTML页面html = download(url)# 分析HTML页面代码,并返回该代码中所有的URLurls = analyse(html)# 对URL列表进行迭代,对所有的URL递归调用crawler函数for url in urls{crawler(url)}
}
# 外部程序第一次调用crawler函数,http://localhost/files/index.html就是入口点的URL
crawler('http://localhost/files/index.html ')

本节的例子需要使用到nginx服务器,下面是nginx服务器的安装方法。

nginx是免费开源的,下载地址是https://nginx.org/en/download.html。如果读者使用的是Windows平台,直接下载nginx压缩包(一个zip压缩文件),直接解压即可。如果读者使用的是Mac OS X或Linux平台,需要使用下面的方式编译nginx源代码,并安装nginx。

进入nginx源代码目录,然后执行下的命令配置nginx。

./configure --prefix=/usr/local/nginx

上面的配置指定了nginx的安装目录是/usr/local/nginx。

接下来执行下面的命令编译和安装nginx。

make && make install

如果安装成功,会在/usr/local目录下看到nginx目录。

下面会使用递归的方式编写了一个全网爬虫,该爬虫会从本地的nginx服务器(其他Web服务器也可以)抓取所有的HTML页面,并通过正则表达式分析HTML页面,提取出a节点的href属性值,最后将获得的所有URL输出到Console。

在编写代码之前,先要准备一个Web服务器(Nginx、Apache、IIS都可以),并建立一个虚拟目录。Nginx默认的虚拟目录路径是根目录>/html。然后准备7个HTML文件,这些HTML文件的名称和关系如图1所示。

很明显,index.html文件是入口点,从index.html文件可以导向a.html、b.html和c.html。从a.html可以导向aa.html和bb.html,从c.html可以导向cc.html。也就是说,只要从index.html文件开始抓取,就可以成功抓取所有的HTML文件。

现在将这7个HTML文件都放在根目录>/html/files目录下,然后按下面的代码编写爬虫程序。

7个HTML文件所在的目录位置是src/firstspider/files

下面是本例的7个HTML文件的代码,爬虫会抓取和分析这7个HTML文件的代码。

<!--  index.html  入口点  -->
<html><head><title>index.html</title></head><body><a href='a.html'>first page</a><p><a href='b.html'>second page</a><p><a href='c.html'>third page</a><p></body>
</html>
<!--  a.html  -->
<html><head><title>a.html</title></head><body><a href='aa.html'>aa page</a><p><a href='bb.html'>bb page</a></body>
</html>
<!--  b.html  -->
<html><head><title>b.html</title></head><body>b.html</body>
</html>
<!--  c.html  -->
<html><head><title>c.html</title></head><body><a href='cc.html'>cc page</a></body>
</html>
<!--  aa.html  -->
<html><head><title>aa.html</title></head><body>aa.html</body>
</html>
<!--  bb.html  -->
<html><head><title>bb.html</title></head><body>bb.html</body>
</html>
<!--  cc.html  -->
<html><head><title>cc.html</title></head><body>cc.html</body>
</html>

从上面的代码可以看到,b.html、aa.html、bb.html和cc.html文件中并没有a节点,所以这4个HTML文件是递归的终止条件。

下面是基于递归算法的爬虫的代码。

from urllib3 import *
from re import *
http = PoolManager()
disable_warnings()
# 下载HTML文件
def download(url):
result = http.request('GET', url)
# 将下载的HTML文件代码用utf-8格式解码成字符串htmlStr = result.data.decode('utf-8')# 输出当前抓取的HTML代码print(htmlStr)return htmlStr
# 分析HTML代码
def analyse(htmlStr):# 利用正则表达式获取所有的a节点,如<a href='a.html'>a</a>aList = findall('<a[^>]*>',htmlStr)
result = []
# 对a节点列表进行迭代for a in aList:# 利用正则表达式从a节点中提取出href属性的值,如<a href='a.html'>中的a.htmlg = search('href[\s]*=[\s]*[\'"]([^>\'""]*)[\'"]',a)if g != None:# 获取a节点href属性的值,href属性值就是第1个分组的值
url = g.group(1)
# 将Url变成绝对链接
url = 'http://localhost/files/' + url
# 将提取出的Url追加到result列表中result.append(url)return result
# 用于从入口点抓取HTML文件的函数
def crawler(url):# 输出正在抓取的Url
print(url)
# 下载HTML文件
html = download(url)
# 分析HTML代码
urls = analyse(html)
# 对每一个Url递归调用crawler函数for url in urls:crawler(url)
# 从入口点Url开始抓取所有的HTML文件
crawler('http://localhost/files')

在运行程序之前,要先启动nginx服务,启动方式如下:

  • Windows:双击nginx.exe文件。
  • macOS和Linux:在终端进入nginx根目录,执行sudo sbin/nginx命令。

程序运行结果如图2所示。

Python爬虫编程思想(7):实战案例:抓取博客文章列表

Python爬虫编程思想(6):实战案例:抓取所有的网络资源相关推荐

  1. python爬取app播放的视频,Python爬虫工程师必学——App数据抓取实战视频教程

    爬虫分为几大方向,WEB网页数据抓取.APP数据抓取.软件系统数据抓取.本课程主要为同学讲解如何用python实现App数据抓取,课程从开发环境搭建,App爬虫必备利器详解,项目实战,到最后的多App ...

  2. Python爬虫编程思想(1):HTTP基础

    目录 1. URI和URL 2. 超文本 3. HTTP与HTTPS 4. HTTP的请求过程 Python爬虫编程思想(2):客户端请求与服务端响应 由于网络爬虫要处理的主要目标是网页,所以在编写爬 ...

  3. Python爬虫 | 斗图网表情包抓取

    Python爬虫 | 斗图网表情包抓取 1.数据来源分析 2.制作div_list 3.发起请求 4.保存图片 5.批量获取 6.完整代码 声明 1.数据来源分析   打开斗图吧的主页,发现网址非常有 ...

  4. Python爬虫编程思想(133):项目实战--利用Appium抓取微信朋友圈信息

    本文利用Appium实现一个抓取微信朋友圈信息的爬虫.在编写爬虫之前,先要启动Appium服务器. 编写基于Appium的爬虫,关键就是分析App每个界面相关元素的特征,也就是如何获取这些元素,然后在 ...

  5. Python爬虫编程思想(48):项目实战:抓取起点中文网的小说信息

    本文会利用requests库抓取起点中文网上的小说信息,并通过XPath提取相关的内容,最后将经过提取的内容保存到Excel文件中.本例需要使用第三方的xlwt库,该库用来通过Python操作Exce ...

  6. Python爬虫编程思想(103):项目实战--抓取QQ空间说说的内容

    本例使用Selenium完成一个综合项目,该项目可以QQ空间说说的内容.首先需要分析一下QQ空间说说的HTML代码. 由于进入QQ空间需要登录,所以抓取QQ空间说说的内容需要如下2步: 模拟登录 抓取 ...

  7. Python爬虫编程思想(114):项目实战--使用Splash Lua抓取京东搜索结果

    本文会利用Splash Lua脚本在京东商城上搜索商品,然后抓取搜索出的商品名称,以及将每一页搜索结果的截图保存为PNG格式的文件. 本例的核心是使用select_all方法通过CSS选择器得到搜索页 ...

  8. Python爬虫编程思想(70): 项目实战--抓取京东商城手机销售排行榜

    本文的例子使用requests抓取京东商城手机销售排行榜,并使用pyquery和CSS选择器提取相关的信息,同时将这些信息保存到Excel文件中.本例抓取总排行榜,并单独提取Apple.华为和小米手机 ...

  9. Python爬虫编程思想(86):项目实战--抓取豆瓣音乐排行榜

    本文的例子抓取了豆瓣音乐Top250排行榜.使用requests抓取相关页面,并使用Beautiful Soup的方法选择器和正则表达式结合的方式分析HTML代码,最后将提取出的数据保存到music. ...

最新文章

  1. php blocklog_SQLSERVER中的logblock校验(译)
  2. MySQL 命令行下执行.sql脚本
  3. java-Mysql学生管理系统
  4. activiti5第三弹-----------脚本任务
  5. OpenCV--读取图像中任意点的像素值,并显示坐标
  6. linux之登录式shell和非登录式shell
  7. ios开发之CoreData使用
  8. 【前台技术】-播放音频
  9. oracle读取blob字段的方法,如何读取Oracle的BLOB字段里的文件?
  10. 一个很好用的,免费的UML在线画图网站
  11. 史上最全的互联网思维精髓总结
  12. linux系统——hadoop环境搭建
  13. jni调用dll方法报UnsatisfiedLinkError
  14. 关于idea中的maven索引异常问题(在idea中创建maven项目时,在pom.xml文件中加入依赖,提示出现的很慢)
  15. WPS无法用backspace删除空白页怎么办?
  16. ps放大素色图标(黑色特别有效)
  17. 阿里巴巴高并发架构到底多牛逼?是如何抗住淘宝双11亿级并发量?
  18. 深度学习算法优化系列十 | 二值神经网络(Binary Neural Network,BNN)
  19. 腾讯全民wifi linux,Linux下安装MT7601U无线网卡驱动
  20. 新建一个工作空间,复制原来工作空间的配置

热门文章

  1. Simulink代码生成(二)——代码生成时模型的配置方法及操作流程
  2. 有50级台阶,每次走一阶或两阶,有多少种走法?
  3. 骁龙780G​和骁龙888哪个好 高通骁龙780G​和骁龙888区别参数对比
  4. 整数转换成罗马数字,Roman Numeral Converter
  5. writedouble_从MySQL中的double write问题说开去
  6. OGeek网络安全挑战赛圆满收官,OPPO倾力培养高校尖端人才
  7. MIPI D-PHY M-PHY C-PHY
  8. 10组高效e人正版注册码
  9. 数据科学 IPython 笔记本 四、Keras(上)
  10. Kill Killall pkill