多线程爬虫实战-思路

这篇具有很好参考价值的文章主要介绍了多线程爬虫实战-思路。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

最近有很多小伙伴找到我,说想要王者荣耀所有英雄皮肤的照片,但是又不想自己去下载,正好借这个机会给大家讲解一下多线程的爬虫实战

由于线程爬虫会对任何服务器都有一定的影响,本文仅供学习交流使用,切勿拿去做什么不好的事情,要做一个合法的爬虫写手。

📝个人主页→数据挖掘博主ZTLJQ的主页

多线程爬虫实战-思路

个人推荐python学习系列:

☄️爬虫JS逆向系列专栏 - 爬虫逆向教学

☄️python系列专栏 - 从零开始学python


那么我们进入第一步,写爬虫的第一步永远都是打开要进行爬取的网站,直接打开王者荣耀的官网即可

打开了官网以后我们就要找到我们需要爬的东西究竟是什么,这个一定要理清楚,我们需要的是英雄皮肤图片,官网的图片如下图:

多线程爬虫实战-思路

 文章来源地址https://www.toymoban.com/news/detail-501162.html

 那么我们可以知道这个页面暂时是没有我们需要的照片,只有英雄的照片,那么我们点击英雄进去链接会发现进去的页面是我们需要的东西。​

 那么我们就按照经验第一步就是看看是不是可以在URL上找到方法,对比多个URL

pvp.qq.com/web201605/herodetail/544.shtml

pvp.qq.com/web201605/herodetail/545.shtml

我们就可以发现,URL只有后面的数字发生了改变,那么我们就可以在URL上做文章,但是还有一个问题,我们并不知道这个数字是从多少开始从多少结束,而且我们也不清楚数字对应的英雄是谁。

于是我就回到了最开始的页面,打开F12,这个是我凭经验进行寻找的,一般这类图片的网站基本上是动态的,所以一定是需要用到抓包工具的,于是我进行抓包,发现了其中的奥秘如下图:

多线程爬虫实战-思路

 一般来说这类JSON数据里面是包括了很多网站的参数的,并且看这个英文名字,太明显了好吗,herolist这不是直接把答案都告诉你了吗英雄列表。

点击这个json文件下载下来以后,就会发现奥秘,如下是其中的一个参数

[{
    "ename": 105,
    "cname": "廉颇",
    "title": "正义爆轰",
    "new_type": 0,
    "hero_type": 3,
    "skin_name": "正义爆轰|地狱岩魂",
    "moss_id": 3627

那么我们在对比一下这个ename是不是一个数字,然后用上面的网址pvp.qq.com/web201605/herodetail/545.shtml

把这个后面的545改成105就会发现对应上了是廉颇这个英雄的皮肤网页,那么就简单了,接下来只需要搞定皮肤页面的爬取就可以了,输入网址后的照片如下:

多线程爬虫实战-思路

 

 接下来在这个皮肤的网页找到每个皮肤的地址,进行批量下载就好了,打开F12定位到皮肤的位置就会发现可以直接用XPATH进行爬取。如下图:

多线程爬虫实战-思路

 这个里面用到的也就是ename中的数据,所以现在所有的思路都已经清晰了,只需要进行代码的编写就好了

首先呢我们需要对json文件进行下载解析

response = requests.get('https://pvp.qq.com/web201605/js/herolist.json')
data = json.loads(response.text)

接下来就需要把json文件中的ename参数和cname参数用上,因为最后存文件就用得到文件夹命名还有之前构造URL

num = j['ename']
name = j['cname']
res2 = requests.get("https://pvp.qq.com/web201605/herodetail/{}.shtml".format(num))
res2_decode = res2.content.decode('gbk')
_element = etree.HTML(res2_decode)
element_img = _element.xpath('//div[@class="pic-pf"]/ul/@data-imgname')
name_img = element_img[0].split('|')

然后进行一个for循环,还有一个文件的写入

for i in range(0,10):
    res1 = requests.get("https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{0}/{0}-bigskin-{1}.jpg".format(num,i+1))
    if res1.status_code == 200:
        aa = name_img[i].find('&')
        bb = name_img[i][:aa]
        res_img = res1.content
        a = './王者荣耀/' + str(name)
        b = './王者荣耀/' + str(name)+'/'+bb+'.jpg'
        if not os.path.exists('./王者荣耀/'):
            os.mkdir('./王者荣耀/')
        if not os.path.exists(a):
            os.mkdir(a)
        with open(b,"wb") as f:
            f.write(res_img)
            print(name,bb)

最后加上一个多线程,开启线程进行爬取就可以了,主体的代码就像下面一样

def pa(j):
    num = j['ename']
    name = j['cname']
    res2 = requests.get("https://pvp.qq.com/web201605/herodetail/{}.shtml".format(num))
    res2_decode = res2.content.decode('gbk')
    _element = etree.HTML(res2_decode)
    element_img = _element.xpath('//div[@class="pic-pf"]/ul/@data-imgname')
    name_img = element_img[0].split('|')

    for i in range(0,10):
        res1 = requests.get("https://game.gtimg.cn/images/yxzj/img201606/skin/hero-info/{0}/{0}-bigskin-{1}.jpg".format(num,i+1))
        if res1.status_code == 200:
            aa = name_img[i].find('&')
            bb = name_img[i][:aa]
            res_img = res1.content
            a = './王者荣耀/' + str(name)
            b = './王者荣耀/' + str(name)+'/'+bb+'.jpg'
            if not os.path.exists('./王者荣耀/'):
                os.mkdir('./王者荣耀/')
            if not os.path.exists(a):
                os.mkdir(a)
            with open(b,"wb") as f:
                f.write(res_img)
                print(name,bb)
        else:
            break


def duo():
    response = requests.get('https://pvp.qq.com/web201605/js/herolist.json')
    data = json.loads(response.text)
    for j in data:
        t = threading.Thread(target=pa,args=(j,))
        t.start()
        h.append(t)
    for k in h:
        k.join()

最后爬出来的效果也是非常好的如下图:

多线程爬虫实战-思路

 

 

到了这里,关于多线程爬虫实战-思路的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 爬虫的分布式思维与实现思路

    scrapy-redis实现分布式,其实从原理上来说很简单,这里为描述方便,我们把自己的 核心服务器 称为 master ,而把用于 跑爬虫程序 的机器称为 slave 我们知道,采用scrapy框架抓取网页,我们需要首先给定它一些start_urls,爬虫首先访问start_urls里面的url,再根据我们的具体逻辑,

    2024年02月12日
    浏览(33)
  • 美团动态线程池实践思路,开源了

    使用线程池 ThreadPoolExecutor 过程中你是否有以下痛点呢? 1.代码中创建了一个 ThreadPoolExecutor,但是不知道那几个核心参数设置多少比较合适 2.凭经验设置参数值,上线后发现需要调整,改代码重启服务,非常麻烦 3.线程池相对开发人员来说是个黑盒,运行情况不能及时感知到

    2024年02月12日
    浏览(28)
  • 重定向爬虫和多线程爬虫

    重定向爬虫是指在抓取网页时,如果目标网站内部存在重定向机制,即当你访问一个网页时,服务器会把你重定向到另一个目标网页。重定向爬虫可以帮助我们发现这种重定向链接,从而更有效地抓取目标网站的内容。 要实现重定向爬虫,你需要在爬虫代码中添加重定向处理

    2024年02月11日
    浏览(48)
  • 【Java】Java中线程安全有哪些实现思路?

    在 Java 多线程编程中,线程安全是一个非常重要的概念。 线程安全通常指程序在多线程并发执行时,仍然能够保持正确的行为。 Java 提供了很多实现线程安全的方法,本文将介绍几种常见的实现思路。 synchronized 是 Java 中最基本的解决线程安全问题的方法,它可以确保

    2024年02月04日
    浏览(34)
  • Python爬虫:单线程、多线程、多进程

    在使用爬虫爬取数据的时候,当需要爬取的数据量比较大,且急需很快获取到数据的时候,可以考虑将单线程的爬虫写成多线程的爬虫。下面来学习一些它的基础知识和代码编写方法。 进程可以理解为是正在运行的程序的实例。进程是拥有资源的独立单位,而线程不是独立的

    2024年02月13日
    浏览(42)
  • 多线程C++代码出现段错误的集中情况和解决思路

    示例代码 解释 在上面的代码中,多个线程同时运行 incrementCounter 函数,该函数增加一个全局变量 globalCounter 。由于对 globalCounter 的访问和修改没有进行适当的同步,这可能导致数据竞争和未定义行为,有时甚至会导致程序崩溃(段错误)。 段错误在这种情况下可能不总是发

    2024年01月25日
    浏览(42)
  • 多线程+隧道代理:提升爬虫速度

    在进行大规模数据爬取时,爬虫速度往往是一个关键问题。本文将介绍一个提升爬虫速度的秘密武器:多线程+隧道代理。通过合理地利用多线程技术和使用隧道代理,我们可以显著提高爬虫的效率和稳定性。本文将为你提供详细的解决方案和实际操作价值,同时附上Python代码

    2024年02月11日
    浏览(49)
  • Python多线程爬虫为何效率低下?解析原因并提高爬虫速度的方法

    线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属的一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建

    2024年02月01日
    浏览(40)
  • python+Selenium多线程后台爬虫例子

    Selenium多线程后台爬虫 一、前言: 有些网站不支持网页源码爬虫、或要爬取的网页内容不在网页源码中, 等需要使用Selenium进行爬虫 二、准备工作: 安装selenium及对应googlechrome浏览器 安装方法:参考安装教程 三、多线程原理: 1、利用同一个浏览器打开多页面、相当于打开

    2024年02月12日
    浏览(36)
  • 基于elasticsearch的自定义业务告警的设计思路,java多线程面试题汇总

    这个是elasticsearch的官方插件,它可以根据数据的变化提供警报和通知,目前是收费的,具体操作配置可以参看官方地址 elastalert 是Yelp公司基于python写的告警框架,大家可以去GitHub上查看具体使用方法。elastalert 自定义开发 自定义开发实现 主要由以下几个步骤实现: 分离出单

    2024年04月25日
    浏览(42)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包