需求分析
上周,我发布了通过scrapy爬取游戏发售信息,但是呢,很快一个小伙伴就联系我说,“仙草哥哥,虽然新游戏很好,但是如果原价购买这些游戏的话,太贵了。能不能做一个游戏折扣信息的爬取呢?”
游戏折扣信息的爬取,这也不是难事情啦,每次通过一样的方式,就可以实现了!即使你不会python和爬虫也不要紧,只要看看我以前的实现,照着进行简单的修改,就可以完成任务了
首先,很确定的是,还是通过requests发起请求,通过lxml处理,最后打印或者保存即可
为什么要通过requests发起请求呢,因为这是一种非常简单的发起请求的方式
那么为什么要通过lxml处理呢,为什么不用正则表达式,或者是字符串处理的函数呢?因为如果解析的是一个标准的,规范的html文本的话,通过lxml进行xpath的解析,是非常容易的一件事情。如果通过正则表达式解析的话,会比较麻烦和繁琐。因此,在爬虫的程序中,最简单的方式,我认为就是通过lxml进行解析
因此,每次只要通过同样的方法,实现一个requests和lxml的程序,就可以完成任务了,非常简单又很轻松
实现分析
首先,要通过requests发起请求
url = "游戏地址"
r = requests.get(url)
不过与平常不同的是,由于steam游戏网站的性能问题,想要访问到该网站不是很稳定,因此不能像平常一样,只进行一次的请求,必须要多进行几次请求,以及进行异常的处理。如果一次请求不能成功得到响应的话,那么就要多请求几次
try:
r = requests.get(url)
except:
r = requests.get(url)
当然,如果这样的话,只能进行一次重复的请求,不是很好,应该通过循环多进行几次请求
# 注意:这样的写法是错误的
# 不能把continue写在这里
try:
while True:
r = requests.get(url)
except:
continue
循环可以放在异常处理的外边,这样就可以在同一个循环中完成continue了
while True:
try:
r = requests.get(url)
break
else:
continue
为什么这样写是可以的呢,因为requests.get()这一步是可能抛出异常的,而break这一步一定不可能抛出异常,所以如果requests.get()这一步没有抛出异常,那么一定可以正常的执行到break,所以这一段内容是正确的
然后,就应该通过lxml对内容进行解析了
div = html.xpath("//div[@class='responsive_search_name_combined']")
for i in div:
title = i.xpath(".//span[@class='title']/text()")[0]
text += "游戏名:"
text += title
discount = i.xpath(".//div[@class='col search_discount responsive_secondrow']/span/text()")[0]
text += "折扣:"
text += discount
price = i.xpath(".//div[@class='col search_price discounted responsive_secondrow']/span/strike/text()")[0]
text += "原价:"
text += price
new_price = i.xpath(".//div[@class='col search_price discounted responsive_secondrow']/text()")[1]
text += "现价:"
text += new_price
这样解析完成之后,就可以得到我们需要的全部内容了。其实总结起来不外乎两步,requests请求,lxml解析。只要学会了这两个点,就能很好的完成爬虫程序了
完整代码展示
import requests
import base64
from lxml import etree
base_url = "aHR0cHM6Ly9zdG9yZS5zdGVhbXBvd2VyZWQuY29tL3NlYXJjaC8/c3BlY2lhbHM9MQ=="
url = base64.b64decode(base_url).decode()
headers = {"user-agent": "Mozilla/5.0"}
for i in range(10):
try:
r = requests.get(url, headers=headers, timeout=8)
break
except:
print("网络连接不太好,请等待...")
if i == 9:
print("网络连接失败,程序已终止...")
raise
continue
html = etree.HTML(r.text)
div = html.xpath("//div[@class='responsive_search_name_combined']")
text = ""
for i in div:
title = i.xpath(".//span[@class='title']/text()")[0]
if not len(i.xpath(".//div[@class='col search_discount responsive_secondrow']/span/text()")):
continue
text += "游戏名:"
text += title
text += "\n"
discount = i.xpath(".//div[@class='col search_discount responsive_secondrow']/span/text()")[0]
text += "折扣:"
text += discount
text += "\n"
price = i.xpath(".//div[@class='col search_price discounted responsive_secondrow']/span/strike/text()")[0]
text += "原价:"
text += price
text += "\n"
new_price = i.xpath(".//div[@class='col search_price discounted responsive_secondrow']/text()")[1]
text += "现价:"
text += new_price
text += "\n"
text += "\n"
print(text)
运行效果展示
从这里,我们就可以看出目前gta5,巫师3狂猎,以及赛博朋克2077都在打折优惠了。而且幅度力度都很大,在半价以上。有了这样的程序,妈妈再也不用担心我错过优惠活动啦
多数爬虫程序很快就会由于对方地址和服务变化导致失效,因此无法保证当你看到这篇文章时,文中的程序仍然可以使用。如果文中的程序已失效,需要自行或者求助他人进行重写
另外,切勿将爬虫程序用于非法用途,或者错误的滥用造成对方网站的负担,谢谢!