首页 > 编程语言 > 详细

Python 高级应用程序设计任务

时间:2019-12-18 13:16:54      阅读:60      评论:0      收藏:0      [点我收藏+]

一、主题式网络爬虫设计方案(15分)
1.主题式网络爬虫名称

爬取淘手游王者荣耀租号的质量
2.主题式网络爬虫爬取的内容与数据特征分析

 最短租期,记时价格,段位,英雄数量,以及皮肤数量


3.主题式网络爬虫设计方案概述(包括实现思路与技术难点)

创建一个get的类,定义get_alldata()方法用来获取网页上的全部信息,get_detail()方法用来对整数数据的进一步加工和提取,再用字典把数据存储起来。

先对整个淘手游的页面进行抓取,然后在对整个租号频道进行抓取,最后在对王者荣耀频道进行抓取

技术难点是,对整个王者荣耀进行抓取无法抓取到比较准确的数据,以及写代码出现的错误

二、主题页面的结构特征分析(15分)
1.主题页面的结构特征

每页25项数据,爬取了49页,数据量为1225条。通过F12查看网页源代码分析需要提取的数据是否存在动态生成的数据,任意查看一个数据项中与原网页中的数据对比后,发现所需要爬取的数据都是静态的。

技术分享图片

 

 


2.Htmls页面解析

技术分享图片

 

 需要摘取的内容有

技术分享图片

 

 

三、网络爬虫程序设计(60分)
爬虫程序主体要包括以下各部分,要附源代码及较详细注释,并在每部分程序后面提供输出结果的截图。
1.数据爬取与采集

技术分享图片

 

   技术分享图片

 

 技术分享图片

 

 


2.对数据进行清洗和处理

技术分享图片

 

 技术分享图片

 

 

技术分享图片

 

 技术分享图片

 

 技术分享图片

 

 


5.数据持久化

 

技术分享图片

 

 


6.附完整程序代码

from operator import contains
import requests
from lxml import html
etree = html.etree
from pandas import DataFrame
import os
headers={
‘authority‘: ‘www.taoshouyou.com‘,
‘method‘: ‘GET‘,
‘path‘: ‘/zuhao/A2705‘,
‘scheme‘: ‘https‘,
‘accept‘: ‘text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3‘,
‘accept-encoding‘: ‘gzip, deflate, br‘,
‘accept-language‘: ‘zh-CN,zh;q=0.9‘,
‘cache-control‘: ‘no-cache‘,
‘cookie‘: ‘$first_referrer=%u53D6%u503C%u5F02%u5E38; $first_referrer_host=undefined; $first_browser_language=zh-CN; $first_visit_time=1576378153653; TSYUUID=e6567672-904c-4e6f-b0b1-9c58c4f77fa6; __cfduid=dbf3c95deea7228c6f987b797793f1ede1576377683; $first_referrer=%u53D6%u503C%u5F02%u5E38; $first_referrer_host=undefined; $first_browser_language=zh-CN; tsyguestid=tsyguest_A54DC56F77EB; PHPSESSID=ab46ad03ca8707d22b561a5f3994e312; Hm_lvt_3479dfbef7091d5aa569ec56e13113df=1576377683,1576377899,1576377978; Hm_lvt_417fdf811fee757b9b1f949949acba5c=1576377683,1576377899,1576377978; Hm_lpvt_3479dfbef7091d5aa569ec56e13113df=1576378020; $first_visit_time=1576378093578; Hm_lpvt_417fdf811fee757b9b1f949949acba5c=1576378154‘,
‘pragma‘: ‘no-cache‘,
‘referer‘: ‘https://www.taoshouyou.com/zuhao/game‘,
‘sec-fetch-mode‘: ‘navigate‘,
‘sec-fetch-site‘: ‘same-origin‘,
‘upgrade-insecure-requests‘: ‘1‘,
‘user-agent‘: ‘Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/77.0.3865.120 Safari/537.36‘
}
file_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), ‘TaoShouYou.csv‘)
#设置地址的循环使用函数
def DiZhiXunHuanHanshu(url):
# 获取页面内容
response = requests.get(url, headers=headers)
#将HTTP响应内容进行解码
text = response.content.decode("utf-8")
# 解析页面内容
html = etree.HTML(text)
ul = html.xpath(‘//ul[@class="p-zuhao-game-list"]‘)[0]
#查找ul下所有的li标签
lis = ul.xpath(‘./li‘)
urls=[]
#遍历lis
for li in lis:
# 获取商品的详细链接
game_url = li.xpath(‘./div[@class="title-box"]/a/@href‘)
# print(game_url)
game_url = game_url[0]
#将获取到的数据进行拼接
game_url="http://www.taoshouyou.com"+game_url
#将game_url加入到date_urls中
urls.append(game_url)
return urls


def main():
for i in range(1,50):
url="https://www.taoshouyou.com/zuhao/A2705?currentPage="+str(i)
TaoNei=DiZhiXunHuanHanshu(url)
for TaoXian in TaoNei:
#定义一个字典,将数据保存到字典中
Subordinat_WZRY={}
response = requests.get(TaoXian, headers=headers)
text = response.content.decode("utf-8")
html = etree.HTML(text)
#获取租号的标题
Game_Title=html.xpath(‘//div[@class="info-goods-title"]/span/text()‘)[0]
# print(Game_Title)
#获取押金
Game_Money=html.xpath(‘//div[@class="p-zuhao-goods-info-right"]/div[@class="info-attr"]/ul/li/span[@class="info-attr-value"]/text()‘)[1].split("元")[0]
# print(Game_Money)
#获取游戏名称
Game_Name = html.xpath(‘//div[@class="p-zuhao-goods-info-right"]/div[@class="info-attr"]/ul/li/span[@class="info-attr-value"]/text()‘)[0]
# print(Game_Name)
#租号的内容
Game_Nei=html.xpath(‘//div[@class="b-trade-info-content-box"]/ul/li[@class="b-trade-info-content-tinfo"]/ul[@class="base-desc "]/li/span/text()‘)
# print(Game_Nei)
#定义两个列表将标题和数据分开
Nei_lis=[]
Nei_value=[]
for i in range(0,len(Game_Nei)):
Nei_lis.append(Game_Nei[i].split(":")[0])
if(len(Game_Nei[i].split(":"))>=2):
Nei_value.append(Game_Nei[i].split(":")[1])
if(‘平台‘ in Nei_lis):#获取平台
index=Nei_lis.index(‘平台‘)
Game_Nei_PingTai=Nei_value[index]
else:
Game_Nei_PingTai=‘null‘
if (‘周租价格‘ in Nei_lis):#周租价格
index = Nei_lis.index(‘周租价格‘)
Game_Nei_zhou_price = Nei_value[index]
else:
Game_Nei_zhou_price = ‘null‘
if (‘运营商‘ in Nei_lis):#运营商
index = Nei_lis.index(‘运营商‘)
Game_Nei_YunXing = Nei_value[index]
else:
Game_Nei_YunXing = ‘null‘
if (‘区‘ in Nei_lis):#区
index = Nei_lis.index(‘区‘)
Game_Nei_qu = Nei_value[index]
else:
Game_Nei_qu = ‘null‘
if (‘最短租期‘ in Nei_lis):#最短租期
index = Nei_lis.index(‘最短租期‘)
Game_Nei_duan_Time = Nei_value[index]
else:
Game_Nei_duan_Time = ‘null‘
if (‘计时价格‘ in Nei_lis):#计时价格
index = Nei_lis.index(‘计时价格‘)
Game_Nei_Time_price = Nei_value[index]
else:
Game_Nei_Time_price = ‘null‘
if (‘日租价格‘ in Nei_lis):#日租价格
index = Nei_lis.index(‘日租价格‘)
Game_Nei_Day_price = Nei_value[index]
else:
Game_Nei_Day_price = ‘null‘
if (‘包夜价格‘ in Nei_lis):#包夜价格
index = Nei_lis.index(‘包夜价格‘)
Game_Nei_Ye_price = Nei_value[index]
else:
Game_Nei_Ye_price = ‘null‘
if (‘段位‘ in Nei_lis):#段位
index = Nei_lis.index(‘段位‘)
Game_Nei_Duanwei = Nei_value[index]
else:
Game_Nei_Duanwei = ‘null‘
if (‘英雄数量‘ in Nei_lis):#英雄数量
index = Nei_lis.index(‘英雄数量‘)
Game_Nei_Yingxiong_Count = Nei_value[index]
else:
Game_Nei_Yingxiong_Count = ‘null‘
if (‘排位赛‘ in Nei_lis):#排位赛
index = Nei_lis.index(‘排位赛‘)
Game_Nei_Paiwei = Nei_value[index]
else:
Game_Nei_Paiwei = ‘null‘
if (‘皮肤数量‘ in Nei_lis):#皮肤数量
index = Nei_lis.index(‘皮肤数量‘)
Game_Nei_Pifu_Count = Nei_value[index]
else:
Game_Nei_Pifu_Count = ‘null‘
Subordinat_WZRY[‘标题‘]=Game_Title
Subordinat_WZRY[‘平台‘]=Game_Nei_PingTai
Subordinat_WZRY[‘运营商‘] =Game_Nei_YunXing
Subordinat_WZRY[‘区‘] =Game_Nei_qu
Subordinat_WZRY[‘最短租期‘] =Game_Nei_duan_Time
Subordinat_WZRY[‘计时价格‘] =Game_Nei_Time_price
Subordinat_WZRY[‘日租价格‘] =Game_Nei_Day_price
Subordinat_WZRY[‘包夜价格‘] =Game_Nei_Ye_price
Subordinat_WZRY[‘周租价格‘] =Game_Nei_zhou_price
Subordinat_WZRY[‘段位‘] =Game_Nei_Duanwei
Subordinat_WZRY[‘英雄数量‘] =Game_Nei_Yingxiong_Count
Subordinat_WZRY[‘排位赛‘] =Game_Nei_Paiwei
Subordinat_WZRY[‘皮肤数量‘] =Game_Nei_Pifu_Count
Subordinat_WZRY[‘押金‘] =Game_Money
Subordinat_WZRY[‘游戏名称‘] =Game_Name
print(Subordinat_WZRY)
df = DataFrame(Subordinat_WZRY, index=[0])
if os.path.exists(file_path):
df.to_csv(file_path, header=False, index=False, mode="a+", encoding="utf_8_sig")
else:
df.to_csv(file_path, index=False, mode="w+", encoding="utf_8_sig")
if __name__ == ‘__main__‘:
main()

四、结论(10分)
1.经过对主题数据的分析与可视化,可以得到哪些结论?

对于皮肤多的账号更受欢迎

对于价格便宜的账号更喜欢

对段位高的账号更加喜欢

 


2.对本次程序设计任务完成的情况做一个简单的小结。

通过爬虫的拉取数据,让我可以更加清晰的了解到大数据是怎么进行的,认识到了自己的不足,还需要认真学习

Python 高级应用程序设计任务

原文:https://www.cnblogs.com/dwsuccessful/p/12058406.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!