核心内容:
1、爬虫的基本原理
2、利用Python爬取数据的方法(使用urllib爬取数据)
3、从斗鱼直播平台爬取图片
最近因为工作的原因,要利用爬虫的相关技术,获取html网页相关的数据,特意总结一下。
我们平时从网页下载数据的过程一般是这样的:
右键单击图片–>查看元素–>复制链接地址–>然后在网页复制相应地址–>打开图片后进行保存即可。
在正式介绍爬虫之前,我们先介绍一下爬虫的基本原理?
爬虫是模拟用户在浏览器或者App应用上的操作,把操作的过程、实现自动化的程序。当我们在浏览器中输入一个url(即域名)后回车,后台会发生什么?比如说你输入https://www.baidu.com。
简单来说这段过程发生了以下四个步骤:
1、查找域名对应的IP地址。
2、浏览器首先访问的是DNS(Domain Name System,域名系统),dns的主要工作就是把域名转换成相应的IP地址
3、向IP对应的服务器发送请求。
4、服务器响应请求,发回网页内容。
5、浏览器显示网页内容。
如下图所示:
网络爬虫要做的,简单来说,就是实现浏览器的功能。通过指定url,直接返回给用户所需要的数据, 而不需要一步步人工去操纵浏览器获取。
接下来我们介绍爬取数据的两种方法:使用urllib爬取数据。(urllib为Python中的两个模块)
重要方法1:urlopen( ) 作用:打开一个url的方法,返回一个文件对象,然后可以进行类似文件对象的操作。
#import module 导入urllib这个模块
import urllib
# 返回一个文件对象f
f = urllib.urlopen("http://www.baidu.com")
#get content of html
#获取html页面的全部内容
content = f.read()
#print the content of html
#将html的源码进行相应的输出
print(content)
运行结果:(部分截图)
通过上面这种方式获取html的源码与下面手动的方式是一样的:
到这里为止,我所理解的爬虫技术感觉就是通过某种技术获取html页面的相应源码。
重要方法2:urlretrieve( ) 作用:urlretrieve方法将url定位到的html文件下载到你本地的硬盘中。
urlretrieve()返回一个二元组(filename,mine_hdrs)
我的理解就是通过urlretrieve方法可以将爬取到的相关数据保存在本次磁盘上面。
示例程序:
#import module
import urllib
tuple = urllib.urlretrieve("http://f12.baidu.com/it/u=800947190,1491613681&fm=72", filename="C:\\1.png")
print(tuple)
运行结果:(返回的是元组)
('C:\\1.png', <httplib.HTTPMessage instance at 0x02CCE4E0>)
其余方法的介绍:
说明:
read( ) , readline( ) ,readlines( ) , fileno( ) , close( ) :这些方法的使用方式与文件对象完全一样。
info( ):返回一个httplib.HTTPMessage对象,表示远程服务器返回的头信息。
getcode( ):返回Http状态码。如果是http请求,200请求成功完成;404网址未找到。
geturl( ):返回请求的url。
如果urlopen( )不能够成功打开一个url,那么会产生一个异常,此时可以通过try来捕获然后处理。
示例程序:
#import module
import urllib
f = urllib.urlopen("http://www.baidu.com")
#else method
print("*"*20)
print(f.info())
print("*"*20)
print(f.getcode())
print("*"*20)
print(f.geturl())
运行结果:
********************
Date: Thu, 23 Mar 2017 13:31:46 GMT
Content-Type: text/html; charset=utf-8
Connection: Close
Vary: Accept-Encoding
Set-Cookie: BAIDUID=679E3AA5BDE9161BAEF3165F0FAABFFD:FG=1; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BIDUPSID=679E3AA5BDE9161BAEF3165F0FAABFFD; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: PSTM=1490275906; expires=Thu, 31-Dec-37 23:55:55 GMT; max-age=2147483647; path=/; domain=.baidu.com
Set-Cookie: BDSVRTM=0; path=/
Set-Cookie: BD_HOME=0; path=/
Set-Cookie: H_PS_PSSID=1423_21079_17001_22173_20927; path=/; domain=.baidu.com
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Cache-Control: private
Cxy_all: baidu+b1e4f27ced231d2437fcc810f5c86b6b
Expires: Thu, 23 Mar 2017 13:31:09 GMT
X-Powered-By: HPHP
Server: BWS/1.1
X-UA-Compatible: IE=Edge,chrome=1
BDPAGETYPE: 1
BDQID: 0xa51f2fc50000f550
BDUSERID: 0
********************
200
********************
http://www.baidu.com
接下来我们利用Python+爬虫技术进行斗鱼直播图片的下载:
re模块:python中的re模块可以完成正则。
其中re.findall 方法能够以列表的形式返回能匹配的子串。
格式:
re.findall(pattern, string[, flags]):搜索string,以列表形式返回全部能匹配的子串。
具体代码实例:
#coding=utf-8
'''
Created on 2017-3-24
@author: hp
'''
#import module
import urllib
import re
f = urllib.urlopen("http://douyu.com")
#获取文件的全部内容
value = f.read()
#打印出文件的全部内容
#print(value)
#获取相应匹配字符串,并以列表的形式进行返回
#src="https://rpic.douyucdn.cn/roomCover/2017/03/02/417441e4948021aa1de92a820abe8ece.png"
imagelist = re.findall(r'src="(.*?\.(jpg|png))"',value)
#从结果来看是一个列别,其中每一个元素是一个元组[(value1),(value2).......]
#查看列表中有多少个图元素
#print(len(imagelist))
# 获取网址:print imagelist[1][0]
#i = 1
#for valueimage in imagelist:
#呵呵,临时目录一定要事先创建
#urllib.urlretrieve("https://staticlive.douyucdn.cn/upload/signs/201702171413265446.jpg", filename="C:\\download\\85.jpg")
#i += 1
#result = [("spark",100),("Hadoop",80),("Hbase",60)]
#print result[0][0]
#具体实现代码
j=0
for valueimage in imagelist:
imageline = valueimage[0]
print('正在下载 %s'%imageline )
urllib.urlretrieve(imageline ,'C:\\download\\%d.jpg'%j)
j+=1
运行结果:
正在下载 https://staticlive.douyucdn.cn/upload/signs/201702171413265446.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201702090013445591.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201701230013318205.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201702231432216493.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201701231144407636.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703171125177671.jpg
正在下载 https://staticlive.douyucdn.cn/upload/abc47e929b7d6c1595ee09379197dc37.png
正在下载 https://rpic.douyucdn.cn/a1703/24/08/1275878_170324080236.jpg
正在下载 https://rpic.douyucdn.cn/roomCover/2017/03/15/a6963f7b192a4d385d4ed0ef6342ba4e.jpg
正在下载 https://rpic.douyucdn.cn/a1703/24/05/1345550_170324053110.jpg
正在下载 https://rpic.douyucdn.cn/a1703/24/08/890434_170324080120.jpg
正在下载 https://staticlive.douyucdn.cn/upload/70ebf27645dcbc0226558a61388410d4.png
正在下载 https://rpic.douyucdn.cn/roomCover/2017/03/21/a477ce28991d835d788abaf98f8096a1.jpg
正在下载 https://rpic.douyucdn.cn/roomCover/2017/03/21/6e9e8feea13588ec22f6c64ecb703a88.jpg
正在下载 https://rpic.douyucdn.cn/a1703/24/08/1822934_170324080211.jpg
正在下载 https://rpic.douyucdn.cn/roomCover/2017/03/04/b0084fd3978b654e53b72391c623a646.jpg
正在下载 https://staticlive.douyucdn.cn/upload/68994677046f5b81ef0b7d85c2442233.png
正在下载 https://rpic.douyucdn.cn/a1703/24/08/673904_170324080024.jpg
正在下载 https://rpic.douyucdn.cn/a1703/24/08/581690_170324080037.jpg
正在下载 https://rpic.douyucdn.cn/a1703/24/08/1216369_170324080059.jpg
正在下载 https://rpic.douyucdn.cn/a1703/24/08/1871158_170324080103.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703221932501348.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703021151411385.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703161353597116.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703221932256128.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703031445295571.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703031444547884.png
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703031351201625.png
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703221921055658.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703101848592200.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703101849362643.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703101850211062.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703101851423194.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201703021328394111.png
正在下载 https://staticlive.douyucdn.cn/upload/signs/201702151300057817.png
正在下载 https://staticlive.douyucdn.cn/upload/signs/201701051521214134.jpg
正在下载 https://staticlive.douyucdn.cn/upload/signs/201701051521428458.png
正在下载 https://shark.douyucdn.cn/app/douyu/res/com/appcode.png
正在下载 https://shark.douyucdn.cn/app/douyu/res/com/dyweixin.png
最后让我们看到爬到的图片吧:
OK,如果是利用函数的话,我们可以这样写代码:
#coding=utf-8
'''
Created on 2017-3-24
@author: hp
'''
#import module
import urllib
import re
#获取网页全部源代码
def getHtmlContent(url):
page=urllib.urlopen(url)
html=page.read()
return html
#具体的download
def getImag(html):
imglist = re.findall(r'src="(.*?\.(jpg|png))"',html)
j=0
for valueimage in imglist:
imageline = valueimage[0]
print('正在下载 %s'%imageline )
urllib.urlretrieve(imageline ,'C:\\download2\\%d.jpg'%j)
j+=1
#获取文件的全部内容
html = getHtmlContent("http://douyu.com")
getImag(html)
OK,就写到这里了,要上班去了!