python爬虫练手--糗事百科图片获取
啥也不说了,直接上代码吧,原先我就比较喜欢糗事百科,工作累了,或者遇到烦心难受的事情,总喜欢来着看看的,用它做练习,就当是给它做个推广了。
(ps:这个爬虫代码简单易懂,小白练手够用了,里面有些地方写的比较繁琐,效率不高,但是参考练手一下,还是可以的)
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import urllib.request
import http.client
import ssl
import gzip
import zlib
import re
import urllib.error as error
import os
# 取消全局的ssl认证
ssl._create_default_https_context = ssl._create_unverified_context
def gzip_decompress(data):
try: # 尝试解压
print('正在使用gzip解压.....')
data = gzip.decompress(data)
print('gzip解压完毕!')
except:
print('未经gzip压缩, 无需解压')
return data
# deflate压缩算法
def deflate_decompress(data):
try:
print('正在使用deflate解压.....')
return zlib.decompress(data, -zlib.MAX_WBITS)
print('deflate解压完毕!')
except zlib.error:
return zlib.decompress(data)
###获取糗事百科所有图片网页的url,并存入函数
###如果知道多少页,可以修改这个函数为对应的页数,已经知道糗事百科有13页图片
def url_all():
result = []
#图片网页数量共13页,利用循环获取
for i in range(1, 14):
result.append('https://www.qiushibaike.com/imgrank/page/%u' %i)
return result
##创建目录页的文件夹
def dirpath_all():
base = 'E:/爬虫数据/1.糗百图片/'
#对应网页数量,创建存放目录
for i in range(1,14):
dirpathmkdir = base + str(i)
if os.path.exists(dirpathmkdir):
print('%s'"已经存在" % dirpathmkdir)
else:
os.makedirs(dirpathmkdir)
print('%s'"不存在!刚刚已经创建" %dirpathmkdir)
# 封装头信息,伪装成浏览器
header = {
'Connection': 'Keep-Alive',
'Accept-Language': 'zh-CN,zh;q=0.8',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
#'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 Safari/537.36',
'User-Agent': 'User-Agent:Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
'Accept-Encoding': 'gzip, deflate',
'X-Requested-With': 'XMLHttpRequest',
}
#网页地址list取出是从0开始的,一共13个地址元素
for i in range(0,13):
#获取网页地址
url = url_all()[i]
#进入目录结构参数的默认值为a=1,默认从"E:/爬虫数据/1.糗百图片/1/"开始
a = 1
try:
# 使用包含header的信息,进行请求
request = urllib.request.Request(url, headers=header)
# 通过urlopen打开包含header的url链接,用来获取数据
response = urllib.request.urlopen(request)
except urllib.error.HTTPError as e:
print(e.code)
except urllib.error.URLError as e:
print(e.reason)
except http.client.error as e:
print(e)
else:
# 读取返回的结果
content = response.read()
# 用于判断是何种压缩算法,如果是gzip则调用gzip算法
encoding = response.info().get('Content-Encoding')
# 判断使用的是不是gzip压缩算法
if encoding == 'gzip':
content = gzip_decompress(content).decode(encoding='utf-8', errors='strict')
# deflate很少有人在用了,老网站可能用,这里也判断一下
elif encoding == 'deflate':
content = deflate_decompress(content)
# 这里获取了所有的img链接,包括头像什么的。
imgre = re.compile('<img src=\"(.+?)\"')
imglist = imgre.findall(content) # re.findall() 方法读取html 中包含 imgre(正则表达式)的 数据
print(imglist)
# 把筛选的图片地址通过for循环遍历并保存到本地
# 核心是urllib.urlretrieve()方法,直接将远程数据下载到本地,图片通过x依次递增命名
x = 0
#确认是否创建对应网页的存放图片的目录,如果有则跳过忽略,没有则创建
dirpath_all()
#配合list的取值参数i,使得a对应的值发生变化,并进入到相应的目录中,开始下载
a += i
#确定目录地址
dirpath = 'E:/爬虫数据/1.糗百图片/%s/' %a
for imgurl in imglist:
# 将正则表达式编译 成pattern对象
pattern = re.compile('\w?//pic.qiushibaike.com/.*.jpg')
# 进行匹配查找
if pattern.match(imgurl):
# 如果匹配成功则进行下载,保存到本地文件夹
try:
# 糗百的html代码 中 关于图片的代码,没有http,需要手动加上
image_data = urllib.request.urlopen("https:" + imgurl).read()
image_path = dirpath + str(x) + '.jpeg'
x += 1
print(image_path)
with open(image_path, 'wb') as image_file:
image_file.write(image_data)
image_file.close()
except error.URLError as e:
print('Download failed')
留个脚印,没事看看自己多无聊