猪肉变贵了?通过爬虫程序爬取猪肉价格
需求分析
今天,有一个小伙伴问我说,“仙草哥哥,我听说最近猪肉涨价了,是真的吗?”
我感到了非常的困惑,“猪肉涨没涨价,你应该去菜市场上看看啊,你问我,我怎么知道啊?”
小伙伴说,“现在都2022年了,怎么还需要去菜市场才能知道菜价呢?谁说呆在家里就不能知道柴米油盐贵了呢?古时候,就有谋士稳坐营中,运筹帷幄,今天你有爬虫程序,怎么就不能通过爬虫程序,给我爬取一下猪肉的价格呢?“
啊,小伙伴话真多,不过,他说的也没错。前几天我们已经通过了爬虫程序爬取了雪糕价格,那么今天,我们就再做一个爬虫程序,爬取一下猪肉价格
实现分析
上次爬取雪糕价格,我们稍微遇到了一点困难,就是价格是写在jquery里面的,我们没有办法直接在html的代码中提取出来,所以说最终使用了selenium渲染了程序,才成功完成了爬虫程序。然而,这次却出乎意外的顺利,没有遇到任何阻碍,就成功拿到了数据
也就是说,首先通过requests发起请求,然后通过xpath进行提取,就能够完整的拿到数据了
# 通过requests发起请求
r = requests.get(url)
# 通过lxml提取数据
time = ul.xpath(".//span[@class='time']/text()")[0]
product = ul.xpath(".//span[@class='product']/text()")[0]
place = ul.xpath(".//span[@class='place']/text()")[0]
price = ul.xpath(".//span[@class='price']/text()")[0]
看来,我们这次的运气不错,遇到了一个没有反爬措施的网站,可以很轻松的获取到全部的数据,然而,就在我这样想的时候,我又运行了一次程序,发现所有的数据都看不到了,这是怎么回事呢?
我查看一下页面,哦,原来是需要验证,看来是触发反爬措施了。也就是说,这个网站看起来没有任何反爬措施,但是实际上,采用的是根据行为的反爬。也就是说,刚开始的时候,确实看起来没有反爬,但是你访问几次以后,它就会将你归类为可疑请求,并要求进行验证
那么现在怎么办呢?重新发送一次请求可以解决问题吗?不可以,看来一旦反爬措施被触发,就必须要验证以后才能通过了。那么,为了解决这个问题,我们必须想办法不要触发这个反爬措施。一个最简单的办法就是使自己的行为看起来更像一个正常用户
比如说,一个正常的用户是不能访问的那么快的,那么为了模仿这一点,我们也把爬取的速度减慢,加上这样的语句
# 等待几秒钟以后,再发送请求
time.sleep(5)
通过时间等待,就是一个好的办法,只要我访问的速度够慢,就不够触发验证的标准。这样,我们的爬虫程序就已经完整的完成啦
完整代码展示
import requests
import time
from base64 import b64decode
from lxml import etree
headers = {"user-agent": "Mozilla/5.0"}
url = b64decode("aHR0cHM6Ly93d3cuY25obmIuY29tL2hhbmdxaW5nL3NoZW5nemh1Lw==").decode()
a_url = b64decode("aHR0cHM6Ly93d3cuY25obmIuY29t").decode()
r = requests.get(url, headers=headers)
html = etree.HTML(r.text)
n_url = html.xpath("//div[@class='eye-pager']/a/@href")[0]
b_url = a_url + n_url[:-2]
c_list = list()
for i in range(1, 12):
url = b_url + str(i) + "/"
r = requests.get(url, headers=headers)
html = etree.HTML(r.text)
ul_list = html.xpath("//li[@class='market-list-item']")
for ul in ul_list:
d = dict()
d["time"] = ul.xpath(".//span[@class='time']/text()")[0]
d["product"] = ul.xpath(".//span[@class='product']/text()")[0]
d["place"] = ul.xpath(".//span[@class='place']/text()")[0]
d["price"] = ul.xpath(".//span[@class='price']/text()")[0]
c_list.append(d)
print("第" + str(i) + "页已完成")
time.sleep(5)
for i in c_list:
print("更新时间:", i["time"])
print("地区:", i["place"])
print("价格:", i["price"])
print()
代码运行效果展示,首先提示完成了多少页的爬取
然后,我们就可以看到我们关心的部分了,就是现在猪肉的价格到底是多少
爬取的速度太慢,自然也不是一件好事情,不过就目前的状况而言,最简单的办法就是慢慢等。冲一杯茶,喝一碗咖啡,吃一根冰棒,回来就可以看到你所需要的结果了,等待也许也不是一件坏事呢?
来源:仙草哥哥