由于审核原因,本文网站换成S,有刚用S的用户怎么办不知道玩什么游戏?往往热卖的商品会让它们成为最合适的选择。当然,第三方网站上的数据会更详细,哪些游戏用户活跃度高,哪些区服游戏比较便宜。但是增加了一层Cloudflare的浏览器验证。有人说用cloudscraper,但是cloudscraper对于商业版的Cloudflare好像不行(应该可以,如果有更好的方法请及时指出,谢谢),我再试试其他的方法未来。所以这里先按下按钮,开始获取S的热卖信息。1.热卖获取分析点击进入热卖产品页面:https://thatwebsite/search/?sort_by=_ASC&force_infinite=1&snr=1_7_7_globaltopsellers_7&filter=globaltopsellers&page=2&os=win上面的链接只能获取第一页的数据。通过开发者模式找到真实内容获取链接:https://thatwebsite/search/results/?query&start=0&count=50&sort_by=_ASC&os=win&snr=1_7_7_globaltopsellers_7&filter=globaltopsellers&infinite=1其中start对应起始位置,对应翻页.count对应于一次获取多少数据。只需获取请求,上面的代码:1.defgetInfo(self):2.url='https://thatwebsite/search/results/?query&start=0&count=50&sort_by=_ASC&os=win&snr=1_7_7_globaltopsellers_7&filter=globaltopsellers&infinite=1'3。res=self.getRes(url,self.headers,'','','GET')#自封装请求方法4.,res=res.=res)6.nodes=sel.css('.search_result_row')7.对于节点中的节点:8.gamedata={}9.gamedata['url']=node.css('a::attr(href)').extract_first()#link10.gamedata['name']=node.css('a.search_name.title::text').extract_first()#gamename11.gamedata['sales_date']=node.css('a.search_released::text').extract_first()#发布日期12.discount=node.css('.search_discountspan::text').extract_first()#是否打折13.gamedata['discount']=discountifdiscount否则'nodiscount'14.price=node.css('a.search_price::text').extract_first().strip()#Price15.discountPrice=node.css('.discounted::text').extract()#折扣后的价格16.discountPrice=discountPrice[-1]ifdiscountPriceelse''17.gamedata['price']=discountPriceifdiscountPriceelseprice#finalprice18.print(gamedata)2.Pandas保存数据2.1构造pandasDataFrame对象Pandas使用pandas对象的to_excel方法存储Excel数据,pandasDataframe对象直接Insert到Excel表中,DataFrame表示矩阵数据表,包含一组已排序的列。首先将获取的数据构造成Dataframe对象,先将获取的数据存入对应的列表,将获取的url存入url列表,将游戏名称存入name列表:1.url=[]2.name=[]3.sales_date=[]4.discount=[]5.price=[]1.url=node.css('a::attr(href)').extract_first()2.ifurl不在自身中。url:3.self.url.append(url)4.name=node.css('a.search_name.title::text').extract_first()5.sales_date=node.css('a.search_released::text').extract_first()6.discount=node.css('.search_discountspan::text').extract_first()7.discount=discountifdiscountelse'nodiscount'8.price=node.css('a.search_price::text').extract_first().strip()9.discountPrice=node.css('.discounted::text').extract()10.discountPrice=discountPrice[-1]ifdiscountPriceelse''11.price=discountPriceifdiscountPriceelseprice12.self.name.append(name)13.self.sales_date.append(sales_date)14.self.discount.append(discount)15.self.price.append(价格)16.else:print('exists')将列表组成相应的字典1.data={2.'URL':self.url,'游戏名称':self.name,'发布日期':self.sales_date,'是否有adiscount':self.discount,'price':self.price3.}}其中dict中的key值对应Excel的列名,然后使用pandas的DataFrame()方法构造对象,然后插入Excel文件。1.data={2.'URL':self.url,'游戏名称':self.name,'发售日期':self.sales_date,'discount':self.discount,'price':self.price3.}}4.frame=pd.DataFrame(data)5.xlsxFrame=pd.read_excel('./steam.xlsx')其中pd是pandas包中导入的对象,习惯上看pd为大熊猫的介绍。importpandasaspd2.2pandasaddtoinsertExcel翻页,你会发现重复调用insertExcel方法时,Excel表格中的数据不会增加,因为每次to_excel()方法都会写入datayouwritelasttime数据被覆盖。所以如果要保留之前写入的数据,那么先把之前写入的数据读出来,然后将DaraFrame对象和新生成的数据合并,将总数据写入Excelframe=frame.append(xlsxFrame)write输入法为如下:1.definsert_info(self):2.data={3.'URL':self.url,'游戏名称':self.name,'saledate':self.sales_date,'discount':self.discount,'price':self.price4.}5.frame=pd.DataFrame(data)6.xlsxFrame=pd.read_excel('./steam.xlsx')7.print(xlsxFrame)8.如果xlsxFrame不是无:9.print('append')10.frame=frame.append(xlsxFrame)11.frame.to_excel('./steam.xlsx',index=False)12.else:el.cme(to_f'./steam.xlsx',index=False)逻辑:1.从已有数据生成DataFrame2.读取之前写入的Excel文件,判断数据是否写入3.写入则读取数据并合并然后再写Excel4。如果源文件为空,直接写入即可。3.代码集成1.importrequests2.fromscrapyimportSelector3.importpandasaspd4.5.classgetSteamInfo():6.7.headers={8."Host":"那个网站",9."接受":"text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",10.“接受编码”:“gzip,deflate,br”,11.“接受语言”:“zh-CN,zh;q=0.9”,12。“用户代理”:“Mozilla/5.0(WindowsNT10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/98.0.4758.82Safari/537.36",13.}14.15.url=[]16.名称=[]17.销售日期=[]18.折扣=[]19.价格=[]#1.价格=[]#1.IP22.defgetapiip(self):23。#获取获取且仅获取一一ip24。api_url='api地址'25.res=requests.gets.get(api_url,timeout=5)2626.尝试:27。如果Res。status_code==200:28.api_data=res.json()['data'][0]29.代理={30.'http':'http://{}:{}'.format[(api_dataip'],api_data['port']),31.'https':'http://{}:{}'.format(api_data['ip'],API_DATA['端口'],32.}33.Price(Proxies)34.ReturnProxies35.else:36.Print('Getfailure')37.Except:38.Print(')39.40.defgetInfo(self):41.url='https://thatwebsite/search/results/?query&start=0&count=50&sort_by=_ASC&os=win&snr=1_7_7_globaltopsellers_7&filter=globaltopsellers&infinite=1'lf=42getRes(url,self.headers,'','','GET')#自封装请求方式43.res=res.json()['results_html']44.sel=Selector(text=res)45.nodes=sel.css('.search_result_row')46.对于节点中的节点:47.url=node.css('a::attr(href)').extract_first()48.如果url不在self.url中:49.self.url.append(url)50.name=node.css('a.search_name.title::text').extract_first()51.leasesales_date=node.css('a.search_red::text').extract_first()52.折扣=node.css('.search_discountspan::text').extract_first()53.折扣=折扣如果折扣其他折扣s('a.search_price::text').extract_first().strip()55.discountPrice=node.css('.discounted::text').extract()56.discountPrice=discountPrice[-1]ifdiscountPriceelse''57.价格=折扣价,如果折扣价,价格58.self.name.append(name)59。self.sales_date.append.append(sales_date)60.self.discount.append.append.append(折扣)61。self.price.price.price.append(价格))62。else:63。print('已已')64。#self.insert_info()65。66.definsert_info(self):67。data={68.'url':self.url,'':self.name,'销售日':self.sales_date,'是否打折':self.discount,'价格':self.price69.}70.Frame=PD.DataFrame(data)71.xlsxframe=pd.read_excel('./Steam.xlsx')72.Print(XLSXFRAME)73.IFXLSXFRAME不为空:74.Print=FRIME=FRIME=frame.append(xlsxFrame)76.frame.to_excel('./steam.xlsx',index=False)77.else:78.frame.to_excel('./steam.xlsx',index=False)809.#发送的特殊方法请求,代理请求三次,失败三次返回错误81.defgetRes(self,url,headers,proxies,post_data,method):82.ifproxies:83.foriinrange(3):84.TRY:85.#传输代理的post请求86.ifmethod=='Post':87.res=requests.post(url,headers=headers,data=post_data,proxies=proxies)88.#89.else:90.res=requests.get(url,headers=headers,proxies=proxies)91.rifres:92.ETURNRes93.Except:94.Print(f'No.{i+1}timesoferror')95.Else:96.ReturnNone97.ELSE:98.forIinRange(3):99.Proxies=self.getapiip()100.TRY:101.#请求代理请求的post请求102.iFMETHOD=='Post':103.res=Requests.post(url,headers=headers,data=post_data,proxies=proxies)104.#请求代理的GET请求105.ELSE:106.res=Requests.get(url,headers=headers,proxies=proxies)107.ifres:108.returnresten:110.print(f"{i"{i"+1}requesterror")111.else:112.returnNone113.114.if__name__=='__main__':115.getSteamInfo().getInfo()是的,这次获取到了数据最近国内访问不稳定。如果想在不购买游戏的情况下获取数据,建议使用代理访问。我这里用的是ipidea的代理,新用户可以白嫖流量。地址:http://www.ipidea.net/最后奉劝大家:适当玩游戏,理性消费,认真生活,支持正品。(大批量数据要存入数据库,其他也支持导出到Excel)
