什么是爬虫?
1、定义:网络爬虫(Web Spider),又被称为网页蜘蛛,按照一定的规则,自动地抓取网站信息的程序或者脚本。
2、简介:网络蜘蛛是一个很形象的名字。如果把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛是通过网页的链接地址来寻找网页,从 网站某一个页面开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。
3、爬虫流程:①先由urllib的request打开Url得到网页html文档——②浏览器打开网页源代码分析元素节点——③通过正则表达式提取想要的数据(正则表达式是最简单的一种方式,还有许多比较复杂的,比如Beautiful Soup或xpath等)——④存储数据到本地磁盘或数据库(抓取,分析,存储)
4、主要用途:抓取我们想要的数据,比如:12306的火车运行数据、网站的图片、证监会的股票数据等,主要作为一种数据获取手段,以便接下来的信息分析、挖掘、处理从而转化成信息,并利用这些信息获得“利益”,比如:今日头条的精准推送。
5、爬虫基本流程:如下图所示:
爬虫的功能就是把网页源代码想办法爬下来,然后分析出需要的内容。总结起来就是2个部分:
1.爬(本文的比较简单,使用了request,主流比较复杂的都使用requests)
2.提取(本文的比较简单,使用了正则表达式,主流的都使用xpath等)
所以,整个爬虫需要掌握的技能,就是如何高效的爬,如何快速的分析提取所需要的内容。
一、本文思路
工具:win8-64bit+Anaconda的spider软件
本教程主要内容是:爬取http://www.27270.com/ent/meinvtupian这个网页所有美女图片,并将其存储在某个文件夹。本教程的工作为了简化难度,主要分为两部分:
1.获取图片的路径,存储到指定的文本文件中
这部分主要完成数据的爬和提取,是整个程序的核心。
2.调用上述的文本,进行图片的下载
这部分主要完成数据的处理,并将其转换成图片。
二、第一部分
1、首先附上代码
import urllib.request
import re
url = "http://www.27270.com/ent/meinvtupian/" #获取url,得到我们要爬取的网页页面地址
pat = 'http://t1.27270.com/uploads/tu(.*?)jpg' #匹配规则,通过分析得到规律
data = urllib.request.urlopen(url).read().decode("gb2312") #读取网页的内容并解码
relut = re.compile(pat).findall(data) #会返回一个列表
file = open(r"G:\getmeizhi\urltu.txt", "w", encoding="gb2312") #这里我定义了一个自己的存储路径,大家可以根据自己的路径修改
for i in relut:
file.write("http://t1.27270.com/uploads/tu") #先写进开头
file.write(i) #将提取的内容写入文件
file.write("jpg") # 将格式写入
file.write("\n") #表示换行
2、然后分析代码
1、得到我们需要获取的网页:http://www.27270.com/ent/meinvtupian
2、分析网页的数据,以便制定正则表达式
在上图网页的界面下按F12或者鼠标右键,选择查看“源文件”出现如下界面,为了快速锁定我们要查找的数据“图片”,ctrl+f快速搜索“.jpg”
通过分析上面红框的格式,我们可以发现这些图片都要前缀http://t1.27270.com/uploads因此我们得到正则表达式如下:
pat = 'http://t1.27270.com/uploads/tu(.*?)jpg
3、读取网页内容并解码
解码的格式,网页的源文件有,可以搜关键词charset得到。
data = urllib.request.urlopen(url).read().decode("gb2312")
其中urlopen()是request模块的一个函数,当得到url打开后用read()读取数据。
4、爬取网页数据,并返回列表
relut = re.compile(pat).findall(data)
这行代码是先用compile()函数得到正则对象,然后传入数据,用findall()函数查找。
注意的是:findall()函数返回的是列表,并且只返回分组内的内容,而不是返回完整的数据串,此时只返回下图蓝框中括号()的内容。
5、将爬取的内容存储到txt文件中
用到了两个知识点:file文件的操作和for函数的使用。
注意:urltu.txt这个文件不用事先存在。
file = open(r"G:\getmeizhi\urltu.txt", "w", encoding="gb2312") #这里我定义了一个自己的存储路径,大家可以根据自己的路径修改。
for i in relut:
file.write("http://t1.27270.com/uploads/tu") #先写进开头
file.write(i) #将提取的内容写入文件
file.write("jpg") # 将格式写入
file.write("\n") #表示换行
file文件操作有三步:
- 得到file对象
- 对file对象进行读或写
- 关闭file对象
三、第二部分
1、首先附上代码
#第二部分:将urltu.txt中的图片链接转换成图片
import os
from urllib import request
read = open(r"G:\getmeizhi\urltu.txt", "r", encoding="gb2312")
s = read.readlines()
print("正在爬取,请稍后!")
q = 1 #设置图片名称从1开始
os.chdir(r"G:\美女图片") #指定存储路径
for i in s:
request.urlretrieve(i, filename=str(q)+".jpg") # i为图片地址,filename是图片的名称
q=q+1
print("爬取完成!")
注意:''G:\美女图片''这个文件夹必须提前建立好。
2、然后分析代码
1、首先按行读出txt文件中数据。
s = read.readlines()
print(s)
此时s中存储的是一个包含地址的字符串列表
2、利用txt里面的包含地址的字符串依次下载图片
并设定了图片保存时的命名格式。
for i in s:
request.urlretrieve(i, filename=str(q)+".jpg") # i为图片地址,filename是图片的名称
q=q+1
四、最终结果
Github的代码链接