看了前面的几步的同学,在这里附上一个爬取图片并下载到本地的方法。同样采用了字典的遍历。
# 这里是为了下载图片
# 导包
import requests
import urllib.request # 下载
import os # 创建
from pyquery import PyQuery as pq
import time # 延迟获取
# 给请求指定一个请求头来模拟chrome浏览器
# headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/54.0.2840.99 Safari/537.36'}
# 在这里定义n是为了规范图片的名字便于后边调用
n = 0
'''
定义一个可以获取页面数据以及提取网页源码的函数
定义一个可以获取href属性值的函数
定义一个可以查找指定元素并提取文本内容的函数
'''
def get_html(url):
# 获取页面内容)(获取数据)
r = requests.get(url)
# 提取网页源代码
html = r.text
if r.status_code == 200:
return html
else:
return "error"
def get_attr(html, sel, attr_name):
# 使用pyquery解析网页,生成pyquery对象
doc = pq(html)
link = doc(sel)
# 找到href属性值
thunder_link = link.attr(attr_name)
return thunder_link
def get_text(html, sel):
doc = pq(html)
# 4. 使用选择器在pyquery中找到指定的元素
t = doc(sel)
# 5. 在找到元素中,提取文本内容
title = t.text()
return title
# 打开图片所在的文件夹
file_path = 'R:\python\图片'
# url固定的部分
url = "https://xs.sogou.com/0_0_0_0_heat/?pageNo="
for i in range(1, 6):
# 字符串拼接
url_new = url + str(i)
html_list = get_html(url_new)
# 使用pyquery解析网页,生成pyquery对象
doc = pq(html_list)
# 找到所需要的元素所在位置
items = doc('.wrapper .box-center .sx-ret .filter-ret .fl .cover').items()
for item in items:
gif = {
'img': 'https:'+item.find('img').attr('src')
}
# 运用字典的遍历去找找到图片链接,注意这里为什么不能直接查找呢?因为图片链接在img标签里,直接查找查找不到。
# 加了个print来判断获取的图片链接是否正确
print("gif['img']: ", gif['img'])
# 这里运用try来检测异常
# 如果当try后的语句执行时发生异常,python就跳回到try并执行第一个匹配该异常的except子句,异常处理完毕,控制流就通过整个try语句(除非在处理异常时又引发新的异常)。
# 如果在try后的语句里发生了异常,却没有匹配的except子句,异常将被递交到上层的try,或者到程序的最上层(这样将结束程序,并打印缺省的出错信息)。
# 如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话),然后控制流通过整个try语句。
try:
if not os.path.exists(file_path):
os.makedirs(file_path) # 如果没有这个path则直接创建
file_suffix = os.path.splitext(gif['img'])[1] # 获得图片后缀
print(file_suffix) # 打印后缀jpg or png
n += 1 # 这里让n+1,注意 python中并不存在n++
# 对下载的图片进行命名.format()这个方法的用法是把字符串里面的{}字符,按次序一一替换成 format() 接受的所有参数。
filename = '{}{}'.format(n, file_suffix) # 命名方式为 n+图片后缀
print(filename) # 打印图片名字来查看是否正确执行上一行的命令
urllib.request.urlretrieve(gif['img'], filename=filename) # 下载图片到指定文件夹
# 如果遇到文件末尾引发的异常,输出1
except IOError as e:
print(1, e)
# 如果遇到打开异常,输出2
except Exception as e:
print(2, e)
# 暂停8s
time.sleep(8)