首页 > 编程语言 > 详细

python实例:爬取caoliu图片,同时下载到指定的文件夹内

时间:2020-11-15 21:16:47      阅读:396      评论:0      收藏:0      [点我收藏+]

本脚本主要实现爬取caoliu某图片板块,前3页当天更新的帖子的所有图片,同时把图片下载到对应帖子名创建的文件夹中

爬虫主要通过python xpath来实现,同时脚本内包含,创建文件夹,分割数据,下载等操作

 

首先,我们分析下caoliu某图片板块的资源链接

技术分享图片

 

贴子对应的页面元素

 

 技术分享图片

展开元素,可以看到帖子的实际地址,所以我们第一步就是把地址都给扒下来

技术分享图片

 

 

 AA里包含了caoliu某图片板块前3页的地址,创建lit空集来收集爬取来的帖子地址

def stepa (AA):
    lit=[]
    for url in AA:
        response = requests.get(url=url, headers=headers, timeout=100000)
        wb_data = response.text.encode(iso-8859-1).decode(gbk)#caoliu的编码格式需要对返回值重新转码
        # 将页面转换成文档树
        html = etree.HTML(wb_data)
        a = html.xpath(//td[@class="tal"]//@href)#帖子地址xpath
        lit.append(a)
    return(lit) 
alllink = stepa(AA)
alllink=alllink[0]

 执行后的结果

技术分享图片

 

 

 

我们获得帖子地址后,获取的帖子地址如上图,所以需要对地址进行处理,同时屏蔽掉站务贴

BB是需要屏蔽掉的站务贴集合,alllink是上一步骤获取的图贴集合,创建循环,从alllink集合里每次取一个链接,if用于跳过账务贴

def stepb(alllink,headers,BB):
    for url in alllink:
        #print(url)
        if "read"  in url:
            continue
        elif url in BB:
            continue
        else:
            url=https://cl.hexie.xyz/+url
            print(url)
            response = requests.get(url, headers=headers)
            response=response.text.encode(iso-8859-1).decode(gbk)
            html = etree.HTML(response)
            b = html.xpath(//div[@class="tpc_content do_not_catch"]//@ess-data)#图片地址xpath
            title = html.xpath(/html/head/title/text())#帖子名称xpath
            title=title[0]
            title=title[:-27]#去掉帖子名称后面共同的和影响创建文件夹的部分
            print(title)

因为获取的链接”htm_data/2011/8/4182612.html“需要重新拼接

拼接步骤”url=‘https://cl.hexie.xyz/‘+url“

后面的步骤就是访问拼接好的url,获取帖子内的图片地址,我们分析下图片资源的元素信息

图片地址存放在"tpc_content do_not_catch"class内,所以xpath可写成”

//div[@class="tpc_content do_not_catch"]//@ess-data“

技术分享图片

 

 

 如此,图片地址就获取到了

技术分享图片

 

 

 

接下来,就是通过地址,下载图片资源到本地

创建文件夹参考:https://www.cnblogs.com/becks/p/13977943.html

下载图片到本地参考:https://www.cnblogs.com/becks/p/13978612.html

附上整个脚本

# -*-coding:utf8-*-
# encoding:utf-8
# 本脚本用于爬取草榴图片板块(新时代的我们)最近3天的所有帖子的所有图片,每一个帖子创建独立的文件夹,图片下载到文件夹中
import requests
from lxml import etree
import os
import sys
import re
import random
from urllib import request
import io

#sys.stdout=io.TextIOWrapper(sys.stdout.buffer,encoding=‘utf8‘)
#解决vscode窗口输出乱码的问题,需要import io 和import sys

headers = {
    authority: cl.hexie.xyz,
    upgrade-insecure-requests: 1,
    user-agent: Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/79.0.3945.88 Safari/537.36,
    accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9,
    sec-fetch-site: none,
    sec-fetch-mode: navigate,
    accept-language: zh-CN,zh;q=0.9,
    cookie: __cfduid=d9b8dda581516351a1d9d388362ac222c1603542964,
}    

path = os.path.abspath(os.path.dirname(sys.argv[0]))

AA=[
    "https://cl.和谐.xyz/thread0806.php?fid=8",
   #"https://cl.和谐.xyz/thread0806.php?fid=8&search=&page=2",
   #"https://cl.和谐.xyz/thread0806.php?fid=8&search=&page=3"
    ]

#AA里包含最新前3页列表链接

BB=["htm_data/1109/8/594739.html",
    "htm_data/1803/8/3018643.html",
    "htm_data/0706/8/36794.html",
    "htm_data/1106/8/524775.html",
    "htm_data/2011/8/344500.html"]

#BB里面包含需要跳过的帖子,这部分帖子是站务贴,里面没资源

#第1步,获取每一页所有的帖子地址,地址格式“https://cl.和谐.xyz/htm_data/2011/8/4182841.html”
def stepa (AA):
    lit=[]
    for url in AA:
        response = requests.get(url=url, headers=headers, timeout=100000)
        wb_data = response.text.encode(iso-8859-1).decode(gbk)#草榴的编码格式需要对返回值重新转码
        # 将页面转换成文档树
        html = etree.HTML(wb_data)
        a = html.xpath(//td[@class="tal"]//@href)#帖子地址xpath
        lit.append(a)
    return(lit) 
alllink = stepa(AA)
alllink=alllink[0]

#第2步,获取每一篇帖子里所有图片的地址,地址格式“https://和谐.xyz/i/2020/11/15/sedlrk.jpg"
def stepb(alllink,headers,BB):
    for url in alllink:
        #print(url)
        if "read"  in url:
            continue
        elif url in BB:
            continue
        else:
            url=https://cl.和谐.xyz/+url
            print(url)
            response = requests.get(url, headers=headers)
            response=response.text.encode(iso-8859-1).decode(gbk)
            html = etree.HTML(response)
            b = html.xpath(//div[@class="tpc_content do_not_catch"]//@ess-data)#图片地址xpath
            title = html.xpath(/html/head/title/text())#帖子名称xpath
            title=title[0]
            title=title[:-27]#去掉帖子名称后面共同的和影响创建文件夹的部分
            print(title)

            path2 = rD://tu 
            os.mkdir(path2 + ./+str(title))
            #以上两行即在d盘tu目录下创建名称为变量title的文件夹

            for c in b:
                print("loading"+" " +c)
                pic_name = random.randint(0,100)#图片名称随机命令

                r = requests.get(c,stream=True,headers=headers)
                time = r.elapsed.total_seconds()#获取响应时间
                if time > 1000:
                    continue
                else:
                    with open(path2 + ./+str(title) +./+str(pic_name) +.jpg, wb) as fd:
                        for chunk in r.iter_content():
                            fd.write(chunk)
                #从87行开始即下载的脚本,把图片下载到上文创建的指定文件夹中

stepb(alllink,headers,BB)

#第3步:提示爬取完成
def over():
    print("ok")
over()   

嘿嘿

技术分享图片

 

python实例:爬取caoliu图片,同时下载到指定的文件夹内

原文:https://www.cnblogs.com/becks/p/13978807.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!