注:本文转载自https://www.zhihu.com/people/zhi-mu-qing-yang/answers 杨航锋的知乎问答。
#encoding:utf-8
#抓取整个网站的唯美图片
import re #导入re模块,正则表达式模块
import time
import requests
def get_html(url, headers):
html = requests.get(url, timeout=100, headers=headers).text #.text转换为一个文本文件,利用timeout设置超时时间
#requests.get(url,params=None,**kwargs),其中params是一个字典,用来发送带参数的get请求,headers为请求头
return html #返回网页地址
def get_main_url(html): #获取主网页
#.*?\.其中.表示匹配除空格意外的任意字符,*?表示重复前面的字符0到无限次,后边的\.表示对.jpg的.的特殊转义,使其保留.jpg的格式
reg = ('http://.*?\.jpg')
main_imglist = re.findall(reg, html)#正则表达式:re.findall(partten,string,flag=0)其中partten是正则表达式,
#string是带匹配的字符串,flag是标志位,用来控制正则表达式的匹配方式
return main_imglist #返回带有图片的主网页地址列表
def get_son_url(html): #获取子网页,结果是返回所有含有图片地址的子网页
initurl = 'http://www.woyaogexing.com'
reg = re.compile('/tupian/weimei/\d+/\d+\.html')
son_urllist_init = re.findall(reg, html)
son_urlist = set(son_urllist_init)
son_url_final = []
for son_url in son_urlist:
son_url_final.append(initurl + son_url)
return son_url_final # 结果是所有含有图片的网页地址 ,到这里返回的是包含所有图片(包括子网页)中的网页地址列表
def get_all_sonurl(son_url_final, headers):
son_imglist = []
for sonurl in son_url_final:
son_html = requests.get(sonurl, timeout=100, headers=headers).text
son_reg = re.compile('http://.*?\.jpg')
son_imglist1 = re.findall(son_reg, son_html)
for temp in son_imglist1:
son_imglist.append(temp)
return son_imglist # 结果是所有子网页图片列表
def get_all_img(main_imglist, son_imglist, headers):
global x # 使用全局变量使每次的变量不清除,这个问题有待完美解决!
for imgurl in main_imglist:
son_imglist.append(imgurl)
for imgurl in son_imglist:
with open('E:/Pic2/%s.jpg' % x, 'wb') as file:
file.write(requests.get(imgurl, timeout=100, headers=headers).content) #图片保存在E盘的Pic2文件夹下
time.sleep(0.1)
x += 1
''' def turn_page():
page_list = ['http://www.woyaogexing.com/tupian/weimei/index.html']
for i in range(1, 7):
page_list.append('http://www.woyaogexing.com/tupian/weimei/index_' + str(i) + '.html')
return page_list '''
if __name__ == '__main__':
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64; rv:44.0) Gecko/20100101 Firefox/44.0',
'Accept': 'text/plain, */*; q=0.01',
'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'Cookie': 'bdshare_firstime=1456041345958; Hm_lvt_a077b6b44aeefe3829d03416d9cb4ec3=1456041346; Hm_lpvt_a077b6b44aeefe3829d03416d9cb4ec3=1456048504',
} #请求头
x = 0
page_list = ['http://www.woyaogexing.com/tupian/weimei/index.html']
for i in range(2, 20):
page_list.append('http://www.woyaogexing.com/tupian/weimei/index_' + str(i) + '.html')
for p in range(6):
html = get_html(page_list[p], headers) #返回各索引网页的响应内容
main_imglist = get_main_url(html)#得到主网页的图片网页地址列表
son_url_final = get_son_url(html)#得到最终的各子网页相应内容
son_imglist = get_all_sonurl(son_url_final, headers)#得到子网页的图片地址列表
get_all_img(main_imglist, son_imglist, headers)#得到所有主、子网页的图片