今天写了个小demo,多线程爬取王者荣耀全皮肤,话不多说,直入主题。
https://pvp.qq.com/web201605/herolist.shtml这个是玩王者荣耀官网上的英雄列表,这个时候一共是100个英雄整。小生这边先是用xpath获取所有<li>标签,再获取里边<a>标签的href属性,可是最后只能收集到93个英雄,不全,于是重新试了一个方法,可以获取全部100个英雄了。
一 观察站点,找方法
因为不直接使用xpath获取,所以小生这边观察了一下各个英雄页面的url,很容易就能得到规律 https://pvp.qq.com/web201605/herodetail/505.shtml 只有里边的505这一串数字是不同的,所以下一步就是找到这个id在哪里。于是就去访问文件里找。
如下图,会在访问文件中找到一个英雄列表(herolist.json)的文件,乱码不要紧,编码问题,程序获取的是没问题。访问这个url下载下来,看的清晰。
手动访问这个文件,获得一串json字符串,可以发现url的id就是这串字符串的ename属性。
现在我们就可以构造一个全英雄url列表。接下来的任务是找到皮肤的url地址。
皮肤的位置很明显,在下图位置,通过观察页面代码,发现这个切换是通过js改变style的背景,如下下图。但是不难发现,这个url的规律:两个505是英雄id,后边的那个1是英雄的皮肤编号。
现在我们也已经可以构造皮肤的url了,不过还有一点,我们还要确定每个英雄拥有的皮肤数量,接着查看源码,不难发现,如下图所示。只需要一点点的改变,用split切割,再用re匹配就可以获得皮肤名称的列表。
万事俱备,开始码代码
二 码代码啊
先简单介绍一下多线程的使用吧,还是都在代码里,看
from queue import Queue # 导入队列,用队列代替列表
import threading # 导入多线程
# 1. 生成队列
queue = Queue()
# 2. 遍历, 将数据添加到queue队列
queue.put(......) # .put让队列计数+1
# 3. 从queue去除数据,进行处理
queue.get()
...
queue.task_down() # .task_down配合.get,可以使队列计数-1
# 4. 添加thread任务
t_list = [] # 用于存放任务
for i in range(3): # 通过循环开启三个线程
t = threading.Thread(target=function_name) # 添加多线程任务
t_list.append(t)
for t in t_list:
t.setDaemon(