回车桌面图片爬取

回车桌面图片爬取

今天我们就来爬爬这个网站 https://tu.enterdesk.com/ 这个网站能爬的资源还是很多的,但我就写一个例子,其他的可以根据思路去写。

首先还是先来分析下这个网站的图片获取过程

我选择的是图库,先随便选择一个标签,我这选宠物吧

哟,我们再看看有没有翻页 开启F12(开发者工具)

用不习惯火狐,还是开谷歌来看吧

那么就访问看看?随便选取一个访问看看是不是能出图片
https://tu.enterdesk.com/chongwu/6.html

结果肯定是可以的啦

问题来了,现在怎么查看最后一页的页码是什么?一种是无限循环下去 直到 没有图片标签的时候报错,还有一种就是从源码中找出页码 那就得看有没有页码按钮 刚才滚轮比较快 现在慢一点 看有没有页码这些东西

这网站还是有页码的,那说明在html源码中能找到页码数

两种方法:
F12工具选择元素

Ctrl+U走一波 源代码直接搜索

现在找到所有页码,接下来就是分析图片源地址了

选择目标图片看看是不是源地址 原图 打开一看其实不是
https://up.enterdesk.com/edpic_360_360/4c/3e/c2/4c3ec2be7061121ad5994a9b51241fa3.jpg

现在再点击进去图片里面 发现是原图了 这时再选择图片查看标签的图片链接

复制上图里面的链接 打开一看就是原图啦 看下图的链接 怎么那么熟悉?

对比下两个链接
https://up.enterdesk.com/edpic_360_360/4c/3e/c2/4c3ec2be7061121ad5994a9b51241fa3.jpg

https://up.enterdesk.com/edpic_source/4c/3e/c2/4c3ec2be7061121ad5994a9b51241fa3.jpg

略缩图 edpic_360_360
原图 edpic_source

这下整体思路就有啦,我们可以获取略缩图的链接将url进行重构,形成原图链接,然后再批量下载就好啦!

开始撸代码了!!!

第一个是 class Spider(): 我们声明了一个类,然后我们使用 def __init__去声明一个构造函数

import requests
all_urls = []  # 我们拼接好的每一页链接

class Spider():
    # 构造函数,初始化数据使用
    def __init__(self, target_url, headers):
        self.target_url = target_url
        self.headers = headers

    # 获取所有的想要抓取的URL
    def getUrls(self):
        #获取末页
        response = requests.get(target_url % 1,headers=headers).text
        html = BeautifulSoup(response,'html.parser')
        res = html.find(class_='wrap no_a').attrs['href']  #找到末页的标签提取末页的链接
        page_num = int(re.findall('(\d+)',res)[0])  #正则匹配 页码数
        global all_urls
        # 循环得到拼接URL
        for i in range(1, page_num + 1):
            url = self.target_url % i
            all_urls.append(url)

分析怎么提取末页链接如下图:

这里我们采用多线程的方式爬取,引入下面几个模块

from bs4 import BeautifulSoup #解析html
import threading #多线程
import re #正则匹配
import time #时间

新增加一个全局的变量,而且是多线程操作,我们需要引入线程锁,避免资源同时写入出错。

all_img_urls = []       #所有图片链接
g_lock = threading.Lock()  #初始化一个锁

声明一个Producer的类,负责提取图片链接,然后添加到 all_img_urls 这个全局变量中

class Producer(threading.Thread):

    def run(self):
        headers = {
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'
        }
        global all_urls
        while len(all_urls) > 0:
            g_lock.acquire()  # 在访问all_urls的时候,需要使用锁机制
            page_url = all_urls.pop(0)  # 通过pop方法移除第一个元素,并且返回该值
            g_lock.release()  # 使用完成之后及时把锁给释放,方便其他线程使用
            try:
                print("分析" + page_url)
                response = requests.get(page_url, headers=headers, timeout=3).text
                html = BeautifulSoup(response,'html.parser')
                pic_link = html.find_all(class_='egeli_pic_li')[:-1]
                global all_img_urls
                g_lock.acquire()  # 这里还有一个锁
                for i in pic_link:
                    link = i.find('img')['src'].replace('edpic_360_360','edpic_source')
                    all_img_urls.append(link)
                g_lock.release()  # 释放锁
                # time.sleep(0.1)
            except:
                pass

线程锁,在上面的代码中,当我们操作all_urls.pop(0)的时候,我们是不希望其他线程对他进行同时操作的,否则会出现意外,所以我们使用g_lock.acquire()锁定资源,然后使用完成之后,记住一定要立马释放g_lock.release(),否则这个资源就一直被占用着,程序无法进行下去了。

if __name__ == "__main__":

    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'
    }

    target_url = 'https://tu.enterdesk.com/chongwu/%d.html'  # 图片集和列表规则

    print('开始获取所有图片页链接!!!')
    spider = Spider(target_url, headers)
    spider.getUrls()
    print('完成获取所有图片页,开始分析图片链接!!!')

    threads = []
    for x in range(10):
        gain_link = Producer()
        gain_link.start()
        threads.append(gain_link)

    # join 线程同步 主线程任务结束之后 进入阻塞状态 等待其他的子线程执行结束之后 主线程在终止
    for tt in threads:
        tt.join()

下面再定义一个DownPic类 用于下载图片

class DownPic(threading.Thread):

    def run(self):
        headers = {
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'
        }
        while True:
            global all_img_urls
            # 上锁
            g_lock.acquire()
            if len(all_img_urls) == 0:  # 如果没有图片了,就解锁
                # 不管什么情况,都要释放锁
                g_lock.release()
                break
            else:
                t = time.time()
                down_time = str(round(t * 1000))  # 毫秒级时间戳
                pic_name = 'D:\\test\\'+ down_time + '.jpg'
                pic = all_img_urls.pop(0)
                g_lock.release()
                response = requests.get(pic, headers=headers)
                with open(pic_name, 'wb') as f:
                    f.write(response.content)
                    f.close()
                print(pic_name + '   已下载完成!!!')

可以看到利用了down_time = str(round(t * 1000)) 来生成毫秒级时间戳来命名图片 其实也可以获取图片的名称来命名 那就靠自己去写一个了

再从if __name__ == "__main__": 添加下面代码 用于开启多线程下载

 print('分析图片链接完成,开始多线程下载!!!')
    for x in range(20):
        download = DownPic()
        download.start()

整体流程就这么写完啦!run下代码

Tips:跑这个代码需要在D盘创建test文件夹 或者自己修改代码实现其他功能

附出完整代码:

import requests
from bs4 import BeautifulSoup #解析html
import threading #多线程
import re #正则匹配
import time #时间

all_urls = []  # 我们拼接好的每一页链接
all_img_urls = []       #所有图片链接
g_lock = threading.Lock()  #初始化一个锁

class Spider():
    # 构造函数,初始化数据使用
    def __init__(self, target_url, headers):
        self.target_url = target_url
        self.headers = headers

    # 获取所有的想要抓取的URL
    def getUrls(self):
        #获取末页
        response = requests.get(target_url % 1,headers=headers).text
        html = BeautifulSoup(response,'html.parser')
        res = html.find(class_='wrap no_a').attrs['href']  #找到末页的标签提取末页的链接
        page_num = int(re.findall('(\d+)',res)[0])  #正则匹配 页码数
        global all_urls
        # 循环得到拼接URL
        for i in range(1, page_num + 1):
            url = self.target_url % i
            all_urls.append(url)

#负责提取图片链接
class Producer(threading.Thread):

    def run(self):
        headers = {
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'
        }
        global all_urls
        while len(all_urls) > 0:
            g_lock.acquire()  # 在访问all_urls的时候,需要使用锁机制
            page_url = all_urls.pop(0)  # 通过pop方法移除第一个元素,并且返回该值
            g_lock.release()  # 使用完成之后及时把锁给释放,方便其他线程使用
            try:
                print("分析" + page_url)
                response = requests.get(page_url, headers=headers, timeout=3).text
                html = BeautifulSoup(response,'html.parser')
                pic_link = html.find_all(class_='egeli_pic_li')[:-1]
                global all_img_urls
                g_lock.acquire()  # 这里还有一个锁
                for i in pic_link:
                    link = i.find('img')['src'].replace('edpic_360_360','edpic_source')
                    all_img_urls.append(link)
                g_lock.release()  # 释放锁
                # time.sleep(0.1)
            except:
                pass

class DownPic(threading.Thread):

    def run(self):
        headers = {
            'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'
        }
        while True:
            global all_img_urls
            # 上锁
            g_lock.acquire()
            if len(all_img_urls) == 0:  # 如果没有图片了,就解锁
                # 不管什么情况,都要释放锁
                g_lock.release()
                break
            else:
                t = time.time()
                down_time = str(round(t * 1000))  # 毫秒级时间戳
                pic_name = 'D:\\test\\'+ down_time + '.jpg'
                pic = all_img_urls.pop(0)
                g_lock.release()
                response = requests.get(pic, headers=headers)
                with open(pic_name, 'wb') as f:
                    f.write(response.content)
                    f.close()
                print(pic_name + '   已下载完成!!!')

if __name__ == "__main__":

    headers = {
        'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Firefox/52.0'
    }

    target_url = 'https://tu.enterdesk.com/chongwu/%d.html'  # 图片集和列表规则

    print('开始获取所有图片页链接!!!')
    spider = Spider(target_url, headers)
    spider.getUrls()
    print('完成获取所有图片页,开始分析图片链接!!!')

    threads = []
    for x in range(10):
        gain_link = Producer()
        gain_link.start()
        threads.append(gain_link)

    # join 线程同步 主线程任务结束之后 进入阻塞状态 等待其他的子线程执行结束之后 主线程在终止
    for tt in threads:
        tt.join()

    print('分析图片链接完成,开始多线程下载!!!')
    for x in range(20):
        download = DownPic()
        download.start()

原文地址:https://www.cnblogs.com/cany/p/10926003.html

时间: 2024-10-06 12:08:24

回车桌面图片爬取的相关文章

知乎高颜值图片爬取

.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > .katex-html { display: block; } .katex-display > .katex > .katex-html > .tag { position: absolute; right: 0px; } .katex { font-style: normal; font

Python爬虫新手教程: 知乎文章图片爬取器

1. 知乎文章图片爬取器之二博客背景 昨天写了知乎文章图片爬取器的一部分代码,针对知乎问题的答案json进行了数据抓取,博客中出现了部分写死的内容,今天把那部分信息调整完毕,并且将图片下载完善到代码中去. 首先,需要获取任意知乎的问题,只需要你输入问题的ID,就可以获取相关的页面信息,比如最重要的合计有多少人回答问题.问题ID为如下标红数字 编写代码,下面的代码用来检测用户输入的是否是正确的ID,并且通过拼接URL去获取该问题下面合计有多少答案. import requests import r

scrapy之360图片爬取

#今日目标 **scrapy之360图片爬取** 今天要爬取的是360美女图片,首先分析页面得知网页是动态加载,故需要先找到网页链接规律, 然后调用ImagesPipeline类实现图片爬取 *代码实现* so.py ``` # -*- coding: utf-8 -*- import scrapy import json from ..items import SoItem class SoSpider(scrapy.Spider): name = 'so' allowed_domains =

糗图-图片爬取

糗图-图片爬取 主要思路 1.来到首页,查看主页有用图片存在html的规律 2.编写re提取图片路径 3.右键图片查看请求图片的具体路径 4.拼接图片请求路径 5.查看下一页界面的路径,找到界面请求路径规律 6.work,多界面爬取指定图片爬虫 import requests import re import os headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.3

爬虫07 /scrapy图片爬取、中间件、selenium在scrapy中的应用、CrawlSpider、分布式、增量式

目录 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 1. scrapy图片的爬取/基于管道类实现 2. 中间件的使用 3. selenium在scrapy中的应用 4. CrawlSpider 5. 分布式 5. 增量式 爬虫07 /scrapy图片爬取.中间件.selenium在scrapy中的应用.CrawlSpider.分布式.增量式 1. scrapy图片的爬取/基于管道类实现 爬取流程: 爬虫类中将解析到的图片

千图网_性感美女图片爬取--图片懒加载

#爬取千图网性感美女模块的图片 #第一页:http://sc.chinaz.com/tupian/xingganmeinvtupian.html #第二页:http://sc.chinaz.com/tupian/xingganmeinvtupian_2.html #两种url结构不同,注意 可以使用if语句判断 import urllib.request import urllib.parse from lxml import etree import time import os #定义下载图

[Python_scrapy图片爬取下载]

welcome to myblog Dome地址 爬取某个车站的图片 item.py 中 1.申明item 的fields class PhotoItem(scrapy.Item): # define the fields for your item here like: # name = scrapy.Field() image_urls = scrapy.Field() images = scrapy.Field() pass spider 的image.py 导入头文件 from Phot

初识scrapy,美空网图片爬取实战

这俩天研究了下scrapy爬虫框架,遂准备写个爬虫练练手.平时做的较多的事情是浏览图片,对,没错,就是那种艺术照,我骄傲的认为,多看美照一定能提高审美,并且成为一个优雅的程序员.O(∩_∩)O~ 开个玩笑,那么废话不多说,切入正题吧,写一个图片爬虫. 设计思路:爬取目标为美空网模特照片,利用CrawlSpider提取每张照片的url地址,并将提取的图片url写入一个静态html文本作为存储,打开即可查看图片. 我的环境是win8.1, python2.7+Scrapy 0.24.4,如何配环境我

python爬虫学习--pixiv爬虫(2)--国际排行榜的图片爬取

之前用面向过程的形式写了一下pixiv爬虫的登录... 觉得还是面向对象好一些... 那就先把登录过程重写一下... class Pixiv_Spider: def __init__(self): self.p_id = '' self.p_pw = '' def Login(self): #处理登录所需要的请求信息 p_login_url = 'https://www.pixiv.net/login.php' data = { #登录所要post的信息 'mode':'login', 'ski