观看学习理解“用python实现手机抓包,获取当当网差评”

这篇博客介绍了如何通过Python脚本结合Appium库来自动化控制手机,抓取当当网图书详情页的差评信息。脚本涉及网络请求的筛选、JSON数据解析以及评论内容的提取,包括用户昵称、评分、评论、创建日期、有用数和无用数等。此外,还展示了如何将抓取到的数据写入CSV文件。整个过程实现了从UI自动化到数据提取的完整流程。
摘要由CSDN通过智能技术生成

通过Charles关联手机数据,下滑获取当当网差评信息,生成的数据如下:

Python脚本如下:

import json

def response(flow):
    url = 'product.mapi.dangdang.com'
    page_size = 'page_size=15'
    # 对url进行筛选,只选取评论的url
    if url and page_size in flow.request.url:
        text = flow.response.text
        data = json.loads(text)
        for item in data['review_list']:
            # 获取用户昵称
            if len(item['cust_name']) > 0:
                name = item['cust_name']
            else:
                name = '无名'
            print(item['cust_name'])
            # 获取用户评分
            if len(item['score']) > 0:
                score = str(item['score'])
            else:
                score = '0'
            print(item['score'] + '\n')
            # 获取用户评论
            content = item['content'].replace(',', ',').replace('\n', '')
            print(item['content'] + '\n')
            # 获取用户评论时间
            creation_date = item['creation_date']
            print(item['creation_date'])
            # 获取有用数
            if len(str(item['total_helpful_num'])) > 0 :
                total_helpful_num = str(item['total_helpful_num'])
            else:
                total_helpful_num = '0'
            print(item['total_helpful_num'])
            # 获取无用数
            if len(str(item['total_useless_num'])) > 0 :
                total_useless_num = str(item['total_useless_num'])
            else:
                total_useless_num = '0'
            print(item['total_useless_num'])
            # 获取评论数
            if len(str(item['total_reply_num'])) > 0 :
                total_reply_num = str(item['total_reply_num'])
            else:
                total_reply_num = '0'
            print(item['total_reply_num'])
            print('\n')
            # 将获取信息写入csv文件
            with open('alive.csv', 'a+', encoding='utf-8-sig') as f:
                f.write(name + ',' + score + ',' + content + ',' + creation_date + ',' + total_helpful_num + ',' + total_useless_num + ',' + total_reply_num + '\n')

 用代码驱动app自动运行:

import time
import random
from appium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from appium.webdriver.common.touch_action import TouchAction
from selenium.webdriver.support import expected_conditions as EC


def main():
    # 设置驱动配置
    server = 'http://localhost:4723/wd/hub'
    desired_caps = {
        'platformName': 'Android',
        'deviceName': 'STF_AL00',
        'appPackage': 'com.dangdang.buy2',
        'appActivity': 'com.dangdang.buy2.StartupActivity'
    }
    driver = webdriver.Remote(server, desired_caps)
    # 这里获取一下手机屏幕实际大小,可以为设置滑动参数做参考
    size = driver.get_window_size()
    print(size)
    wait = WebDriverWait(driver, 60)
    # 因为要叫我切换地区,选择取消
    button_1 = wait.until(EC.presence_of_element_located((By.ID, 'com.dangdang.buy2:id/left_bt')))
    button_1.click()
    # 点击图书榜按钮
    button_2 = wait.until(EC.presence_of_element_located((By.ID, 'com.dangdang.buy2:id/index_icon_iv0')))
    button_2.click()
    # 点击图书「活着」区域块
    button_3 = wait.until(EC.presence_of_element_located((By.XPATH, '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.support.v4.view.ViewPager/android.widget.RelativeLayout/android.widget.ListView/android.widget.LinearLayout[2]')))
    button_3.click()
    # 点击评论区域块
    button_4 = wait.until(EC.presence_of_element_located((By.ID, 'com.dangdang.buy2:id/product_component_book_score_ll')))
    button_4.click()
    time.sleep(5)
    # 点击差评按钮
    button_5 = wait.until(EC.presence_of_element_located((By.XPATH, '/hierarchy/android.widget.FrameLayout/android.widget.LinearLayout/android.widget.FrameLayout/android.widget.RelativeLayout/android.support.v4.view.ViewPager/android.widget.LinearLayout/android.support.v4.view.ViewPager/android.widget.RelativeLayout/android.widget.LinearLayout/android.view.ViewGroup/android.widget.RelativeLayout[6]/android.widget.TextView')))
    button_5.click()
    # 向下滑动,y轴参数我随便选的,向上滑就对了
    while True:
        TouchAction(driver).press(x=515, y=1247).move_to(x=515, y=1026).release().perform()
        time.sleep(float(random.randint(5, 10)))


if __name__ == '__main__':
    main()

 则可成功得到数据。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值