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.结束
需要完整代码私信我,立马给你