python爬虫一键爬下整页美女图片

最近大四闲在家里特别无聊,毕业设计也想不出做啥,无聊泡论坛的时候发现自己没怎么做过爬虫啊,做几个爬虫练练手

既然做爬虫,就爬点有意思的东西,于是随便找了个网站爬一爬
在这里插入图片描述
这个网站结构还算简单网址直接是index_12345.html
直接做个循环就可以爬下所有的网址
在这里插入图片描述
捋一下思路

  1. 访问主页
  2. 获取图片详情页丢到线程里跑一下保存,然后自动获取每一套图的下一页循环保存
  3. 存的时候做一下判断有没有重复的图片,有就直接取消了,顺便把文件夹名字改为详情页的标题好分类
    运行结果
    先跑个线程把第一页爬了
import threading  # 导入threading模块
from queue import Queue  # 导入queue模块
import time  # 导入time模块
import requests
import os
from lxml import etree as et

#请求头
headers = {
    #用户代理
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
}
# 待抓取网页基地址
base_url = 'http://www.***.com/mnmm/index.html'
# 保存图片基本路径
base_dir = 'E:/DateCenter/个人项目/图/'

# 保存图片
def savePic(pic_url,img_dir):
    file_name = base_dir + img_dir+'/'+pic_url.split('/')[-1]
    # 如果目录不存在,则新建,如果文件存在,则跳出
    if not os.path.exists(base_dir + img_dir):
        os.makedirs(base_dir + img_dir)
    elif os.path.exists(file_name):
        return
    # 获取图片内容
    response = requests.get(pic_url, headers=headers)
    # 写入图片
    with open(file_name, 'wb') as fp:
        for data in response.iter_content(1024):
            fp.write(data)

# 循环爬取一套图片地址并存储
def get_detail_queue(detail_url):
    # Queue队列的put方法用于向Queue队列中放置元素,由于Queue是先进先出队列,所以先被Put的URL也就会被先get出来。
    detail_url_list=Queue(maxsize=50)
    detail_url_list.put(detail_url)

    while not detail_url_list.empty():
        url = detail_url_list.get()  # Queue队列的get方法用于从队列中提取元素
        img_rq = requests.get(url=url, headers=headers)
        # 请求状态码
        code =img_rq.status_code
        if code == 200:
            html = et.HTML(img_rq.text)
            # 获取页面所有图片地址
            r = html.xpath('//*[@id="showimg"]/a/img/@src')
            # 获取下一页url
            next_url = html.xpath('//*[@id="showimg"]/a[@title="下一张"]/@href')
            #获取标题
            dir=url.split('/')[-2]
            dir+='/'+str(html.xpath('//*[@id="showimages"]/div[2]/h2/text()')[0])
            if url.split('_')[0]==next_url[0].split('_')[0]:
                detail_url_list.put(next_url[0])

            savePic(r[0],dir)

    print("{id}下载完成".format(id=dir))



# 生成图片详情网址
def get_detail_list(list_url):
    #list_url_queue = queue(maxsize=1000)
    # time.sleep(1) # 延时1s,模拟比爬取文章详情要快
    #page_url = base_url + format(i)+'.html'#有图片的页面地址
    #page_url ='http://www.souutu.com/mnmm/xgmm/13062_1.html'
    index_rq = requests.get(url=list_url, headers=headers)
    # 请求状态码
    code = index_rq.status_code
    if code == 200:
        html = et.HTML(index_rq.text)
        # 获取页面所有套图地址
        detail_list = html.xpath('//*[@id="body"]/main/div[4]/div/div[@class="card-box"]/div[1]/a/@href')
        # 获取下一页url
        next_url = html.xpath('//*[@id="showimg"]/a[@title="下一张"]/@href')
        html_thread = []
        for url in detail_list:
            url=url.replace('.html', '_1.html')
            print(url)
            thread = threading.Thread(target=get_detail_queue, args=(url,))
            thread.start()
            html_thread.append(thread)  # 线程抓取抓取图片
        for i in html_thread:
            i.join()

    print("============================detail_list {id} get=====================================".format(id=list_url.split('/')[-1]))  # 打印出得到了哪些文章的url

# 主函数
if __name__ == "__main__":

    get_detail_list(base_url)

有的时候下的图片没下好,有一半糊的,这个时候可以删除掉,再跑一遍,
之后就是好的了

还有一些想做的功能没有实现,做个ip池防止被检测啥的,下载速度也没跑满,不过已经写了很久了,下次再说吧!

The End!

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值