爬取创意工坊,居然是为这个?

爬取创意工坊,获取游戏ID和模组ID

爬虫:
1.分析页面:

以我喜欢的游戏“边缘世界”为创意工坊为例分析

https://steamcommunity.com/app/294100 这是边缘世界社区首页url
https://steamcommunity.com/sharedfiles/filedetails/?id=3235960401 这是边缘世界随机模组url
294100 代表游戏ID 3235960401 代表模组ID

如何在用户输入的模组URL获取它们呢?
F12 + Ctrl+F + URL 首先通过开发工具确定这两个链接的位置,以便爬虫解析

提示:分析URL的位置时,我们可以找到多个,应选最通用、方便解析和功能升级的位置

进阶:
背景:官方SteamCMD无法下载模组集合,这很难受!
任务:解析模组集合页面,获取游戏ID和所有模组ID,并得出单模组和集合的解析通用“公式”

2.爬取解析页面:

作者使用 requests + lxml

import requests as rq
from lxml import etree

HEADERS = {
    'User-Agent':
        'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/121.0.0.0 Safari/537.36',
    'Accept-Language':
        'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6'
} # 游览器F12 ——> 网络 ——> 随便一个文件,找到请求头复制

site = rq.get(url,headers=HEADERS,verify=False,timeout=(120,100)) # 发起请求,获取响应
url:请求网址
headers:请求头
verify:是否安全认证 # 关闭verify安全验证 由于国内原因上steam工坊需要科学上网造成ssl证书问题
timeout:第一个数字是连接超时时间(connect timeout),第二个数字是读取超时时间(read timeout)

text = site.text # 获取源代码

# 创建HTML解析器
parser = etree.HTMLParser(encoding='utf-8')
# 将str转换成解析对象
html = etree.HTML(text,parser)

# 知识补充:解析本地文件
filePath = 'Html文件路径'
parser = etree.HTMLParser(encoding='编码')
html = etree.parse(filePath,parser)
xpath 简单介绍:

可以通过F12 并右键复制xpath路径获取

/表示从标签开始
//表示整个文档
标签名[@class/id=‘’]获取标签对应属性
text()获取文本部分

完整代码:

def getSourceCode(url:str,is_verify=True) -> str | None:
    # 忽略警告
    urllib3.disable_warnings()
    # 关闭verify安全验证 由于国内原因上steam工坊需要科学上网造成ssl证书问题
    try:
        site = rq.get(url,headers=HEADERS,verify=is_verify,timeout=(120,100))
        if site.status_code == 200:
            text = site.text

            return text
    except:
        return None

def getParseObject(text:str) -> etree._Element | None:
    if text is None:
        return None

    parser = etree.HTMLParser(encoding='utf-8')
    # 将str转换成解析对象
    html = etree.HTML(text,parser)
    return html

def getGameID(object:etree._Element) -> str:
    try:
        initial_path = object.xpath('//div[@id="responsive_page_template_content"]//div[@class="breadcrumbs"]/a[1]')[0]
        url = initial_path.attrib['href']
    except IndexError:
        url = ''
    return url.replace(COMMUNITYURL,'')

def getModsID(object:etree._Element) -> tuple:
    # xpath模糊匹配以xx开头:starts-with
    a = object.xpath('//a[starts-with(@id,"SubscribeItemBtn")]')

    return tuple([i.attrib['onclick'].replace(' ','').split("'")[1] for i in a])
  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值