。。其实我不喜欢玩王者的,,不过壁纸好看就算了脑部链接
毕竟企鹅baba的网站,不是那么好爬的。。壁纸图片的url并不在网页源代码中,所以通过减缓网页加载速度来得到这些url 藏在了哪里。。。具体方法可见我之前写的爬网易云的方法。
经过操作我们会在worklist。。。。。这个文件中找到我们需要的数据。不过是加密的,放到 json解析网站上一解析就有了
注意要删掉jQuery171019307142189807158_1586675620843(
这个开头和最后的小括号。这些蓝色的就是我们要的 url了。不过还是解密的。所以打开我们的python,使用parse 这个解码工具,于是我们就有了真正的url。。。。。
from urllib import parse
result = parse.unquote('http%3A%2F%2Fshp%2Eqpic%2Ecn%2Fishow%2F2735040117%2F1585734643%5F84828260%5F29030%5FsProdImgNo%5F3%2Ejpg%2F200')
print(result)
>>>http://shp.qpic.cn/ishow/2735040117/1585734643_84828260_29030_sProdImgNo_3.jpg/200
我们要的是大的图,根据在原网站上看到的图片地址做一下对比,将最后的200改成0就好了。。。
所以说我们要的数据就在这个url 中,并且通果其中page=数字,来获取不同页面的壁纸(page在哪?自己找吧)…
Request URL: https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page=9&iOrder=0&iSortNumClose=1&jsoncallback=jQuery171019307142189807158_1586675620843&iAMSActivityId=51991&everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&=1586676909304
速度飞起,,爬虫真是太神奇了,hhhhh
from urllib import parse, request
import requests
import os
import threading
import queue
headers = {
'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36',
"Referer": "https://pvp.qq.com/web201605/wallpaper.shtml"}
class Producer(threading.Thread): # 生产真正的url
def __init__(self, page_queue, image_queue, *args, **kwargs):
# 重写构造函数,传入队列。代表了任意位置参数和关键字参数
# 因为我们重写了init 函数,所以要想正常使用还要调用父类的方法。
super(Producer, self).__init__(*args, **kwargs)
self.page_queue = page_queue
self.image_queue = image_queue
def run(self) -> None:
while not self.page_queue.empty():
url = self.page_queue.get()
resp = requests.get(url, headers=headers)
result = resp.json()
datas = result['List']
for data in datas:
image_urls = extract_images(data)
name = parse.unquote(
data['sProdName']).strip().replace(
"1:1", "") # 避免取名出错,不能有空格,不能有冒号之类的
dirpath = os.path.join("images1", name)
if not os.path.exists(dirpath):
os.mkdir(dirpath) # 避免重复创建文件
for index, image_url in enumerate(image_urls):
self.image_queue.put({
'image_url': image_url, 'image_path': os.path.join(
dirpath, "%d.jpg" % (index + 1))})
# 消费者需要从生产者提取图片链接和保存路径,所以以字典的方式添加。
class Consumer(threading.Thread):
def __init__(self, image_queue, *args, **kwargs):
super(Consumer, self).__init__(*args, **kwargs)
self.image_queue = image_queue
def run(self) -> None:
while True:
try:
image_obj = self.image_queue.get(timeout=10)
# 得到一个字典,设置超时,如果图片已经下载完避免一直卡在那抛出异常
image_url = image_obj.get('image_url')
image_path = image_obj.get('image_path')
try:
request.urlretrieve(image_url, image_path)
print("%s下载完成!" % (image_url))
except:
print('下载失败')
except:
break
def extract_images(data):
image_urls = []
for x in range(1, 9):
image_url = parse.unquote(
data['sProdImgNo_%d' % x]).replace("200", "0")
# unquote(string, encoding='utf-8', errors='replace')
image_urls.append(image_url)
return image_urls
def main():
page_queue = queue.Queue(10)
image_queue = queue.Queue(1000) # 保存每个图片url 的中间队列,所以要大一点
for i in range(0, 10):
url = 'https://apps.game.qq.com/cgi-bin/ams/module/ishow/V1.0/query/workList_inc.cgi?activityId=2735&sVerifyCode=ABCD&sDataType=JSON&iListNum=20&totalpage=0&page={page}&iOrder=0&iSortNumClose=1&iAMSActivityId=51991&_everyRead=true&iTypeId=2&iFlowId=267733&iActId=2735&iModuleId=2735&_=1586675621245'.format(
page=i)
page_queue.put(url)
for x in range(3):
th = Producer(page_queue, image_queue, name='生产者%d号' % x)
th.start()
for x in range(5):
th = Consumer(image_queue, name='消费者%d' % x)
th.start()
if __name__ == '__main__':
main()
然后我在想,,,如果当初把打王者的时间用来敲代码,,,,,,,