python 小爬虫,爬取我要个性网的唯美图片

注:本文转载自 杨航锋的知乎问答。

#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)#得到所有主、子网页的图片
经验分享 程序员 微信小程序 职场和发展