猪肉变贵了?通过爬虫程序爬取猪肉价格

需求分析

今天,有一个小伙伴问我说,“仙草哥哥,我听说最近猪肉涨价了,是真的吗?”

我感到了非常的困惑,“猪肉涨没涨价,你应该去菜市场上看看啊,你问我,我怎么知道啊?”

小伙伴说,“现在都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()

代码运行效果展示,首先提示完成了多少页的爬取

然后,我们就可以看到我们关心的部分了,就是现在猪肉的价格到底是多少


爬取的速度太慢,自然也不是一件好事情,不过就目前的状况而言,最简单的办法就是慢慢等。冲一杯茶,喝一碗咖啡,吃一根冰棒,回来就可以看到你所需要的结果了,等待也许也不是一件坏事呢?

来源:仙草哥哥

物联沃分享整理
物联沃-IOTWORD物联网 » 猪肉变贵了?通过爬虫程序爬取猪肉价格

发表评论