python爬取叮咚买菜评价数据

2023-05-22 16:25:17 浏览数 (1)

疫情这这几年,线上买菜成了大家日常生活的一部分,出现了叮咚买菜,京东到家,朴朴超市等app,这些买菜app我们可以买到新鲜蔬菜、水果、肉禽蛋、米面粮油、水产海鲜、南北干货、方便速食等等。对上班族来说真的是很方便的软件。

有竞争就有对比,消费者会通过平台直接的各方面进行对比选择更有利的一款app。最近不少川渝地区的叮咚买菜用户表示“叮咚买菜真的要撤出川渝地区了吗”“叮咚买菜要溜了?五折快冲”“传叮咚买菜川渝区域大撤退,29号关闭”,在正式发布通知之前,叮咚买菜撤出川渝的消息就已四散。撤离的消息来得突然,却也可以预料,毕竟当下叮咚买菜的境况并不乐观

那么我们今天就利用python爬虫技术去了解下大家对这款购菜app的评价吧。数据来源于叮咚买菜app,但是就像美团评价一样,这个网站评论数据的获取也是稍微有点难度的,最直接的就是会遇到网站封IP行为,这样的前提下我们只有先准备好高质量的爬虫代理才能去获取数据了。这里我们使用python通过Keep-Alive保持IP不变,向多个页面发出请求,通过多线程实现并发控制。IP的使用由亿牛云提供的爬虫隧道加强版产品。爬虫数据实现的过程如下所示例:

代码语言:javascript复制
#! -*- encoding:utf-8 -*-
import requests
import random
import requests.adapters
import threading # 导入threading模块
import time # 导入time模块

# 要访问的目标页面
targetUrlList = [
    "https://httpbin.org/ip",
    "https://httpbin.org/headers",
    "https://httpbin.org/user-agent",
]

# 代理服务器(产品官网 www.16yun.cn)
proxyHost = "t.16yun.cn"
proxyPort = "31111"

# 代理验证信息
proxyUser = "SWRSED"
proxyPass = "458796"
proxyMeta = f"http://{proxyUser}:{proxyPass}@{proxyHost}:{proxyPort}"

# 设置 http和https访问都是用HTTP代理
proxies = {
    "http": proxyMeta,
    "https": proxyMeta,
}

# 定义一个全局变量,用于记录上一次请求的时间
last_request_time = 0

# 定义一个全局变量,用于创建一个线程锁
lock = threading.Lock()

# 定义一个函数,用于访问一个目标网址
def visit_url(url, i):
    global last_request_time # 声明全局变量
    with requests.session() as s: # 使用with语句管理会话
        with lock: # 使用线程锁
            # 获取当前时间
            current_time = time.time()
            # 计算距离上一次请求的时间差
            delta_time = current_time - last_request_time
            # 如果时间差小于200毫秒,就等待一段时间
            if delta_time < 0.2:
                time.sleep(0.2 - delta_time)
            # 更新上一次请求的时间
            last_request_time = time.time()
        # 发送请求
        r = s.get(url, proxies=proxies)
        print(f"第{i 1}个网址,结果如下:") # 使用f-string格式化输出
        print(r.text)

# 创建一个空的线程列表
threads = []
for i, url in enumerate(targetUrlList): # 使用enumerate函数遍历列表
    # 创建一个线程,传入目标网址和索引
    t = threading.Thread(target=visit_url, args=(url, i))
    # 将线程添加到线程列表
    threads.append(t)
    # 启动线程
    t.start()
# 等待所有线程结束
for t in threads:
    t.join()

0 人点赞