用python分析csgo市场走势

python环境:python3.10.4

mysql5.7

看下网站的模样

期望的效果是下面的样子 

 说下用到的包

import requests 用来提取html源代码
from bs4 import BeautifulSoup 分析源代码

import mysql.connector
from pymysql import Connect 二选一,因为我做了入库,可以不入库,就不用mysql了,可以自行选择,因为用了mysql,所以我用了uuid和datatime 用来记录时间和唯一主键
import xlwt 做了导出excl,可以不导出,只打印,自行选择

说下步骤把

1.分析页面的url,因为要获取的整个市场的数据,所以获取饰品列表的每一页

2.分析页面元素,定位需要的数据是在哪个标签里?

3.把数据分类,磨损和价格贴纸或者刀。(这里只演示了刀和贴纸)

4.入库

5.导出

一,分析URL

 这里类型选到匕首,会发现url变了,是这样的

#https://www.igxe.cn/market/csgo?ctg_id=5&page_size=20

如果选印花,是这样的

#https://www.igxe.cn/market/csgo?ctg_id=8&page_size=20

       在 问号前面的是url,而问号(?)后面的是参数 多个参数用&链接

       注意看,两个url的不同点在于ctg_id ,再去选择其他类型,改变的只有ctg_id

       这就意味着,ctg_id是饰品的类型。听明白的抠1,如果你直接去修改url的ctg_id参数,会发现显示的饰品类型也会发生改变。

       在注意看,第二个参数 page_size, 翻译一下应该是页面大小的意思。在这里其实是页面饰品的数量,也就是一个页面显示多少个饰品。很明显是20 不信可以自己数一下,不是20你干我。

        我是这样写的

url = 'https://www.igxe.cn/market/csgo?ctg_id='+shipin_type+'&sort=2&page_no='+str(i)

把ctg_id和page_no设为一个变量,把他写进一个方法里,循环调用,page_no是第几页

       OK.下面就开始获取页面数据了。

  

        #该网站会识别爬虫,要模拟浏览器进入网站,这里用到AG伪装,就是给一个请求头

        按F12,进入开发者模式,点击NetWork,刷新页面,左侧Name下会有若干个数据包,任意点开一个拿到这个User-Agent的内容,作为我们的header,伪装成功。

header = { 'user-agent': 'Mozilla/5.0 (Linux; Android 6.0; Nexus 5 Build/MRA58N) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Mobile Safari/537.36'}

#定义URL ,也就是目标url 要爬取的网站,(我的URL前面多一个#,复制代码的话去掉#)

url = '#https://www.igxe.cn/market/csgo?ctg_id=8&page_size=20'

#这里要用到requests库的get方法,两个参数 一个是目标网站地址,另一个就是我们的header

res = requests.get(url=url, headers=header)

#打印res.text

print(res.text)

会发现打印出了整个页面的源代码,有head,title,body,我们将会在这些内容里,挑肥拣瘦,抠出我们想要的数据

二,定位数据(磨损,价格)元素位置

1.按F12 点控制台上面的小鼠标

2.点击 饰品的div,红框里的内容就是我们要爬取的内容

3.

datas = BeautifulSoup(res.text, 'html.parser')

BeautifulSoup初始化,把html内容放进去,后面跟html.parser,说明我们要解析的内容是html格式的。

4.继续重复 前两步骤 1&&2的操作,继续分析, 会发现其实所有的饰品div都在一个 div里面,整个div 的class是

list list,把鼠标放在红框的时候,左侧所有饰品都会被选中

5.通过class选择器获取class = list list 的div,用find来获取单个标签内容,find方法返回的list是一个<class 'bs4.element.Tag'>对象

list = datas.find('div', class_='list list')
print(type(list))#用type()来打印返回值类型

#这个div就是一个页面包含所有饰品的div,所以就说明获取到这个div,已经拿到页面所有的饰品

6.接下来开始解析这个div,获取每一个饰品的名称和磨损还有价格

       #所有的内容都从上面的list中获取,list 包含页面中所有的饰品

        #继续F12分析,会发现这个div中有若干个<a></a>标签,准确来说是20个

        #所以获取<a>标签就是获取每个饰品

        #如果在一个大内容中获取多个标签的小内容 要用到findAll 方法,他的返回值类型是<class 'bs4.element.ResultSet'>

all_result = list.findAll('a', class_='item')
print(type(all_result))

all_result 是一个集合类型,里面装的是list中的所有的<a>标签,

list里有好多东西,通过findAll方法把所需要的<a>标签的内容提取出来,装进all_result里

7.接下来要提取饰品的属性,所以需要一个对象来装,然后把对象装进一个集合里

#首先先创建刀的对象,这里为了简单 用了内部类,并对外提供get方法

name是刀的名称,price是价格,mosun是磨损

class Dao:
    def __init__(self, name, price, mosun):
        self.name = name
        self.price = price
        self.mosun = mosun

    def getName(self):
        return self.name

    def getPrice(self):
        return self.price

    def getMoSun(self):
        return self.mosun

#创建三个集合,分别装刀的属性,这里的作用域的全局的

mosun_list = []
name_list = []
price_list = []
final_list = []#最终把对象放进一个集合里

8.遍历all_result集合提取所有属性,并装进属性集合里

for i in all_result:
        #把每一个a标签重新解析,获取a标签下面的div
    test = BeautifulSoup(str(i), 'html.parser')
            #获取磨损
    mosun = test.find('div', class_='cover').text
                #把磨损数据 放进 mosun_list里,后面创建对象使用到
    mosun_list.append(mosun)
    name = test.find('div', class_='name').text
    name_list.append(name)
    price = test.find('div', class_='price').text
    price_list.append(price.replace('¥', ''))

       #如果价格的集合和name的集合,磨损的集合的数量都一致,说明爬取的没问题,
    if len(price_list) == len(name_list) == len(mosun_list):
        index = 0
        for i in price_list:    
                #把属性都给Dao的构造器,创建对象
            dao = Dao(name_list[index], price_list[index], mosun_list[index])
            index += 1
                #创建好的对象放进final_list里后面入库导出都会用到
            final_list.append(dao)

print('本页爬取数据'+str(final_list.__len__())+"条")

9.入库,

def put_all(type):
    now = datetime.datetime.now().strftime('%Y/%m/%d %H:%M:%S')
    now2 = datetime.datetime.now().strftime('%Y%m%d')
    # 连接到本地 MySQL 数据库
    mydb = mysql.connector.connect(
        host="127.0.0.1",
        user="root",
        password="root",
        database="user"
    )
    ll = 0
    # 创建一个游标对象
    mycursor = mydb.cursor()
    for i in final_list:
        mosun = str(final_list[ll].getMoSun()).replace(' ', '').replace('   ', '')
        price = str(final_list[ll].getPrice())
        name = str(final_list[ll].getName())
        ll = ll+1
        sql = "INSERT INTO ku (id, name, price,date,quality,type) VALUES (%s, %s,%s, %s,%s,%s)"
        print(name+"---"+price+"-----"+mosun)
        val = ("zzh" + str(uuid.uuid1()) + now2, name, price, now, mosun,type )

        mycursor.execute(sql, val)

        # 提交更改
        mydb.commit()

10.导出

def download():
    global cursor
    # 连接到本地 MySQL 数据库
    mydb = Connect(
        host="localhost",
        user="root",
        password="root",
        port=3306
    )
    # 创建一个游标对象
    cursor = mydb.cursor()
    # 选择数据库
    mydb.select_db("user")
    # 使用游标对象,执行SQL语句
    cursor.execute("select a.name,a.price,a.quality,a.type,a.date from ku a  ")
    # 获取查询结果
    result = cursor.fetchall()
    fileds = cursor.description
    workbook = xlwt.Workbook()
    sheet = workbook.add_sheet('ku', cell_overwrite_ok=True)
    for filed in range(0, len(fileds)):
        sheet.write(0, filed, fileds[filed][0])
        row = 1

        col = 0

        for row in range(1, len(result) + 1):
            for col in range(0, len(fileds)):
                sheet.write(row, col, u'%s' % result[row - 1][col])
    workbook.save('D:\\test\\1.xls')

11.结束

需要完整代码私信我,立马给你

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值