- A+
Python爬虫学习 第一篇 准备
近期使用python用来爬取网络图片,之前也有分章介绍,这次统一汇总介绍下我的爬虫过程。
爬虫是啥
网络爬虫是什么?
看意思是一个虫子,一个什么虫子?实际上指的是蜘蛛spider。
蜘蛛结成网,在网上爬来爬去的寻找坠入网络中的食物。
网络爬虫就是差不多的意思,在互联网上爬来爬去的寻找你的精神食物。
开始爬前的准备
要开始爬,你得先知道爬哪里吧,你得先获得网页的源码即HTML信息吧,获得后,你需要分析出链接和图片等资源吧。
要获取HTML并分析网页信息,需要下载一个第三方的库requesets,下载地址:
下载并解压
最重要的是 这个库有完善的中文资料 ,讨厌蝌蚪文的可以放心的参考
你如果和我一样使用pycharm来编辑,加入第三方库的步骤如下:
安装好requests第三方库后,开始测试
开始获取HTML
怎么样,惊喜不惊喜,简单不简单,使用其它语言,无法用这么简单的语句就获得html的信息。
解析HTML
使用request获取了网页源码,下一步就是如何解析了,你如果用过C++等语言,你会发现很难找到顺心的网页解析库,但python在这方面却很擅长。
还是用一个第三方库 Beautiful Soup
这是个什么库呢?
直译为:漂亮的汤?
难道是将网页作为美味的汤,从这汤里慢慢品味其中滋味,抽丝剥茧的分析汤的构成成分、汤的味道? 老外的思路,真难猜,先不管这个了。
说白了,就是用来解析HTML或XML,从中提取有用数据的库。
而且也有强大的中文支持
首先分析,解析哪些链接
这应该是按类别来分的,我们在源码中找到这一项
之所以有乱码,很可能是与我电脑没有日文字体有关也可能编码不正确,先不管它了,目前对解析无影响,可以看出,这些类别是放在class=menu的div下了,具体的就是这个DIV下的<a链接标签
1、好了,首先第一步,获得这个DIV
这样我们就获得了这个DIV的内容,下面再继续解析这个DIV
2、解析DIV
解析这个DIV,还要以这个DIV内容为参数,构造一个BeautifulSoup(以下简称为BS :) 注意绝不是鄙视的意思)对象,因为全篇只有一个menu 类型的DIV,所以所有类型都保存在上面解析的div_menu[0]中了,将这个对象强制转换为字符串类型做BS的参数
看源码可以发现,链接都是站内链接
现在注意了,我要把所有的链接提取出来
输出所有的链接
对应HTML源码
可以看到,第一个 a标签,是没有href属性的,所以,会输出None,其它a标签,正常输出
因为这些都是站内链接,
我们先定义一个变量,表示该站的域名
又因为,有的链接可能是none,所以需要判断下是否存在href属性,下面是输出所有链接的代码
输出的链接如下:
这样,我们就正确的获得了这些类别对应的网址了。
下一步工作,下一节再说,现在还有些事,改天聊
第二篇
https://docs.python.org
书接上回,上文书说道,我们已经获得了所有类别的链接。
下面我将这些链接保存到一个临时文件中,其实不保存也可以,但开始学python,借这个机会,也练练如何创建目录,保存文件。
将上文获得的主链接保存到文件中
定义一个函数,搞不懂,为什么python不用C语言那样的定义函数,也不用C语言的那样的循环和跳转,一时用惯了别的语言的人,很难一下子转过来。
这是写的将链表中的链接,保存到文件中去,
写到一个文件中,有点乱,因此,我又新建了一个py文件,用以编写常用的函数,取名为common.py
下载获得的主链接
因为我把所有的常用函数,写到common.py中了,所以要导入这个文件
主程序中,要用到这个common中自定义的保存函数
经过测试,可以将列表内容,写入文件了。
现在,我又看了看,觉得很乱,我想单独的建立一个目录tmp,用来保存临时文件
目录文件相关的,要引入os
不管怎么说,使用下面代码,已经把所有的链接都保存在临时文件中。
第三篇
本节思路
理一理逻辑,先不去考虑细节,逻辑理清了,根据这个逻辑去实现细节就好了。我也是第一次使用python,也没有时间看文档,因为想获得图片素材,直接就想爬一个网站。
我们之前,已经分析了首页,获得了图片类别对应的链接,并将这些链接保存在了本地文件中。
下面,
第一步,我们会下载主链接网页,保存在本地文件中。
第二步,分析主链接,获得相应的所有分页网址
第三步,将主链接及分页链接,统统下载下来
下载下来后,后续我们会解析网页,获得图片地址,下载图片,本节主要完成前三步即可。
下载主链接网页,保存在本地
上文,我们将首页中主链接保存了起来,
下面,为了免去每次下载网页的麻烦,我们一次性下载这些网页,并保存在本地中
主文件中,就一句话,因为细节都封装在另一个文件中了,我们主要考虑逻辑,细节可以通过查资料去实现,去调试。
这是common.py中写的下载函数
其中调用了单个网址下载函数downHtml
通过上述代码,已经将链接下载到了本地。
获得分页链接
上文提到,解析了首页,将所有的主分类链接保存到了本地文件中。
我们再打开一个主链接看看
每个主链接,都有相应的分页链接
我们下面的目的,就是获得主链接对应的所有分页链接
分析网页源码
分页链接保存在class=link2的 div下
其中,获得分页链接的代码如下:
将所有的链接对应的网页,下载到本地
这是下载后的本地文件
第四篇
本节目的:解析下载到本地的文件,获得图片链接
所有相关的网址,都下载到本地了,下面我们依次解析,获得图片链接,然后将图片链接保存起来。
由上图,可看到
是一组,保存着背景图片,那我们解析的时候,将这一组图片,单独的放在一个文件夹background中
是另一组,解析的时候,单独的放在一个文件夹中
第一步,我们遍历目录,获得所有的文件路径
为此,我写了个函数
#目录下的文件和文件夹def GetAllSubFile(dir,list):
#目录下的文件def GetAllSubFile(dir,list,ext):
#目录下的文件夹def GetAllSubDirs(dir,list):
调用
txtFileList=[]common.GetAllSubFile(tmpDir+"htmls",txtFileList,"txt")
获得目录下的txt文件路径,保存在txtFileList中。
第二步 解析文件,获得IMG路径
1、 首先,针对不同分组,创建相应的子目录
是一组,保存着背景图片,那我们解析的时候,将这一组图片,单独的放在一个文件夹background中
我们将右侧的数字去掉,剩下的字符串作为这一组的类别
分析源码
图像链接保存在class=subcontents的div下,
<img 属性为 data-layer 下
为此我写了个函数
调用
common.FindAllImg(txtFile,"div","subcontents","data-layzr")
获得文件中,所有图片的链接列表,、
这一过程的代码如下:
第五篇
下载图片链接
本节的主要任务是下载文件中获得的图片链接
为此我写了个函数
def downImg(httpPath,localPath):
实测中,考虑到有些链接不存在,有些链接超时,有些链接其它错误,所以一次下载不了,多次尝试。
而且使用request.urlretrieve(httpPath,localPath) 直接下载时,出现出现10060错误,于是使用request.urlopen(httpPath,timeout=60),然后以读的方式进行下载。
我这的目录结构是这样的
第一步,读取所有的子文件夹
第二步,读取子文件夹下的img.txt
第三步,下载img.txt中的链接
为此,我又写了下面的函数
DownThumbnail 是下载缩略图,因为这个网站上,目前或的的这些链接对应的是缩略图。
运行后,就会发现,可以下载了
目前是单线程方式下载的缩略图
下一节介绍下多线程方式,下载高清图
第六篇
多线程方式下载
使用:
下载下的图片,
多线程下载速度是比单线程要快一些