题目要求
- 爬取数据的链接:https://down.gamersky.com/pc/
- 爬取内容:游戏名称、游戏类型、游戏图片地址、文件大小、游戏热度
- 将爬取内容写入文件
解题思路
- 导入所需要的第三方库
from lxml import etree import requests
-
将所需要爬取的网页下载到本地(避免重复请求网页拒绝访问)url="https://down.gamersky.com/pc/" headers={"User-Agent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64) " "AppleWebKit/537.36 (KHTML, like Gecko) " "Chrome/93.0.4577.82 Safari/537.36"} response=requests.get(url,headers=headers) html=response.text with open("游戏.html","w",encoding="utf-8") as file: file.write(html)
-
lxml库解析的步骤
-
1.获取网页html内容的字符串
-
2.生成可以解析的Element对象
html=etree.HTML(接收的str)
-
3.使用xpath()方法进行节点或者特定节点的提取
-
具体实现
1.解析
如果出现
lxml.etree.XMLSyntaxError: AttValue: " or ' expected, line 31, column 51
不是你的错,是网页语法错误,需要自己编写一个解析器
代码实现:
parser=etree.HTMLParser(encoding="utf-8") #自己编写解析器
html=etree.parse("游戏.html",parser=parser)
2.使用某歌插件xpathHelp(具体操作因为审核未通过没有放出来)
使用ctrl+shift+x启动插件
长按CTRL+SHIFT
,鼠标指向需提取的段落,按X
开启或关闭提取,提取到的段落会变为黄色。
3.爬取内容:游戏名称、游戏类型、游戏图片地址、文件大小、游戏热度
灵活使用xpathHelper插件
游戏名称
tilte=html.xpath("//li[@class='lx0']/div[@class='tit']/a/text()")
游戏类型
type=html.xpath("//li[@class='lx0']/div[@class='txt'][2]/text()")
游戏类型爬取的是 游戏类型:第一人称射击
这里采用一个循环将我们不需要的内容替换掉
typec=[] #存放爬取的关键内容 for i in type: typec.append(str(i).replace('游戏类型:',''))#游戏类型:被''替换
游戏图片地址
address=html.xpath("//li[@class='lx0']/div[@class='img']/a/img/@src")
文件大小
size=html.xpath("//li[@class='lx0']/div[@class='txt'][4]/text()")
#类似于上面的游戏类型
sizec=[]
for i in size:
sizec.append(str(i).replace('文件大小:',''))
游戏热度
popluar=html.xpath("//li[@class='lx0']/div[@class='txt'][5]/span[@class='hotdegree']/@tip")
4.将爬取和筛选过后的内容写入文件
with open('游戏.txt','w',encoding='utf-8') as file:
file.write("游戏名称"+'\t'+"游戏类型"+'\t'+"游戏图片地址"+'\t'+"文件大小"+'\t'+"游戏热度"+'\n')
for i in range(len(size)):
file.write(tilte[i]+'\t'+typec[i]+'\t'+address[i]+'\t'+sizec[i]+'\t'+popluar[i]+'\n')