Python爬虫学习:python抓取4399上的炉石传说原画

2019-12-25 17:01:58 浏览数 (1)

炉石传说原画1

炉石传说原画2

本打算使用Selenium模拟点击获取图片信息

尝试发现源码中 该按钮并无相应的跳转链接

这不应该啊 没有相应的跳转链接 点击后是如何加载新的图片?

后来浏览整体网站源码后 发现把问题想复杂 根本不需要模拟点击查看更多

网站其实已经加载了所有的卡牌原画 只是之后的原画做了隐藏处理默认不展示 style=display

点击查看更多后 显示原画

那么只需使用requests获取网页源码

用BeautiSoup/正则表达式/pyQuery解析元素 遍历相应img的url 即可下载

Github

教训:爬虫前 不要根据网页所对的操作实施相应的代码爬取 不要有这样的思维定式 首先要做的是先大体浏览分析整个网页的源代码 有的可能直接写在源码或json或js中 无需再加工

炉石传说卡牌

该网站通过下拉右边的滚动条不断加载新的卡牌

与上一个网站不同 上一个网站一次性写入了所有卡牌 只不过做了隐藏处理

该网站是通过js动态加载渲染出的卡牌 直接获取源码 无法得到所有卡牌信息

那么就用selenium模拟下拉滚动条(selenium简直居家必备之神器)

使用selenium执行js脚本 每次执行下拉1000个单位滚动条 执行90次

为什么是90次 测试出来的 大概90次拉到底

注意:这里要增加1~3秒的暂停时间 用于网页渲染

第一次没有设置停留时间 无法获取新的数据 怀疑自己 怀疑人生

经前端/后端好友L君的提示 需增加暂停时间 这样才能获得加载渲染后的数据

browser.page_source便可获得动态加载的所有数据

有了数据 之后就很简单 正则匹配获取相应url下载即可

爬取炉石传说卡牌源码

代码语言:javascript复制
# -*- coding: utf-8 -*-
# @Author: kjjdas
# @Date:   2018-08-05 10:49:35
# @Last Modified time: 2018-08-05 19:08:34


from selenium import webdriver
from pyquery import PyQuery as pq
import requests
import time 
import re 


def get_html():
    browser=  webdriver.Chrome()
    browser.get('http://cha.17173.com/hs/')

    for i in range(90):
        browser.execute_script('var q=document.documentElement.scrollTop=' str(i*1000))
        time.sleep(1)


    time.sleep(3)
    html = browser.page_source.encode('GBK', 'ignore').decode('GBk')
    browser.close()
    return html 

def get_imgs(html):    
    img_urls = re.findall(r'return false;" target=""><img src="(.*?)"', html)
    for img_url in img_urls:
        img_url = img_url.split('?')[0]
        img_content = requests.get(img_url).content
        with open('./卡牌/' img_url.split('/')[-1],'wb') as f:
            f.write(img_content)


def main():
    html = get_html()
    get_imgs(html)

if __name__ == '__main__':
    main()

爬取炉石传说卡牌原画源码

代码语言:javascript复制
# # -*- coding: utf-8 -*-
# # @Author: kjjdas
# # @Date:   2018-08-05 00:34:43
# # @Last Modified time: 2018-08-05 18:49:31


import requests
from pyquery import PyQuery as  pq 
html = requests.get('http://news.4399.com/gonglue/lscs/kptj/').content.decode('gbk')
doc = pq(html)
items = doc('#dq_list > li').items()
# print(items)
for item in items:
    # print(item)
    url = item.find('img').attr('lz_src')
    url_content = requests.get(url).content
    name = item.find('.kp-name').text()
    with open('./卡牌原画/' name '.jpg','wb') as f:
        f.write(url_content)

最后获得了800张原画 1324张卡牌

0 人点赞