本文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理

以下文章来源于AirPython ,作者星安果

目标

场景:有时候通过传统的方法去爬一些 Web 网页或者 APP,受限于对方的反爬方案,很难爬到想要的数据,这个时候可以考虑使用「Appium」结合「mitmproxy」的方式去爬取数据。

其中,Appium 负责驱动 App 端自动化运行,mitmproxy 负责截取请求数据并解析保存到数据库。

今天的目的是爬取「当当网」的所有数据,并保存到 MongoDB 数据库当中。

准备工作

首先,需要在 PC 上安装好 Charles 和 Appium Desktop,并配置好 mitmproxy 环境。

# 安装mitmproxy依赖包

pip3 install mitmproxy

# 安装pymongodb

pip3 install pymongo

另外,需要准备一台 Android 手机,另外 PC 端配置好 Android 开发环境。

爬取思路

1. 在配置好手动代理的情况下,打开 Charles 实时捕获客户端的发起的网络请求。

打开当当网搜索商品的页面,搜索关键字「Python」,可以在 Charles 查看到当前请求的 URL 地址包含:「word=Python」

编写 mitmproxy 的执行脚本文件,重写 response() 函数,通过对请求的 URL 进行过滤,对有用的数据进行整理并保存到 MongoDB 数据库当中。

class DangDangMongo(object):

"""

初始化MongoDB数据库

"""

def __init__(self):

self.client = MongoClient('localhost')

self.db = self.client['admin']

self.db.authenticate("root", "xag")

self.dangdang_book_collection = self.db['dangdang_book']

def response(flow):

# 过滤请求的URL

if 'keyword=Python' in request.url:

data = json.loads(response.text.encode('utf-8'))

# 书籍

products = data.get('products') or None

product_datas = []

for product in products:

# 书ID

product_id = product.get('id')

# 书名

product_name = product.get('name')

# 书价格

product_price = product.get('price')

# 作者

authorname = product.get('authorname')

# 出版社

publisher = product.get('publisher')

product_datas.append({

'product_id': product_id,

'product_name': product_name,

'product_price': product_price,

'authorname': authorname,

'publisher': publisher

})

DangDangMongo().dangdang_book_collection.insert_many(product_datas)

print('成功插入数据成功')

先打开客户端的手动代理监听 8080 端口,然后执行「mitmdump」命令,然后滚动商品界面,发现数据到写入到数据库中了。

mitmdump -s script_dangdang.py

2. 下面我们要利用 Appium 帮我们实现 自动化。

首先打开 Appium Desktop,并启动服务。

打开 Android Studio,利用菜单栏的 Build-Analyze APK 分析当当网的安卓应用,打开 AndroidManifest.xml

可以发现应用包名和初始化 Activity 分别为:

com.dangdang.buy2、com.dangdang.buy2.StartupActivity

获取到包名和初始 Activity 后,就可以利用 WebDriver 去模拟打开当当网 APP。

self.caps = {

'automationName': DRIVER,

'platformName': PLATFORM,

'deviceName': DEVICE_NAME,

'appPackage': APP_PACKAGE,

'appActivity': APP_ACTIVITY,

'platformVersion': ANDROID_VERSION,

'autoGrantPermissions': AUTO_GRANT_PERMISSIONS,

'unicodeKeyboard': True,

'resetKeyboard': True

}

self.driver = webdriver.Remote(DRIVER_SERVER, self.caps)

接着使用 Android SDK 自带的工具 uiautomatorviewer 获取到元素信息,使用 Appium 中的 WebDriver 去操作 UI 元素。

第一次打开应用的时候,可能会出现红包雨对话框、新人专享红包对话框、切换城市对话框,这里需要通过元素 ID 获取到关闭按钮,执行点击操作来关闭这些对话框。

这里创建一个 新的线程 来单独处理这些对话框。

class ExtraJob(threading.Thread):

def run(self):

while self.__running.isSet():

# 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回

self.__flag.wait()

# 1.0 【红包雨】对话框

red_packet_element = is_element_exist(self.driver, 'com.dangdang.buy2:id/close')

if red_packet_element:

red_packet_element.click()

# 1.1 【新人专享券】对话框

new_welcome_page_sure_element = is_element_exist(self.driver, 'com.dangdang.buy2:id/dialog_cancel_tv')

if new_welcome_page_sure_element:

new_welcome_page_sure_element.click()

# 1.2 【切换位置】对话框

change_city_cancle_element = is_element_exist(self.driver, 'com.dangdang.buy2:id/left_bt')

if change_city_cancle_element:

change_city_cancle_element.click()

extra_job = ExtraJob(dangdang.driver)

extra_job.start()

接下来就是点击搜索按钮,然后输入内容,执行点击搜索对话框。

# 1.搜索框

search_element_pro = self.wait.until(

EC.presence_of_element_located((By.ID, 'com.dangdang.buy2:id/index_search')))

search_element_pro.click()

search_input_element = self.wait.until(

EC.presence_of_element_located((By.ID, 'com.dangdang.buy2:id/search_text_layout')))

search_input_element.set_text(KEY_WORD)

# 2.搜索对话框,开始检索

search_btn_element = self.wait.until(

EC.element_to_be_clickable((By.ID, 'com.dangdang.buy2:id/search_btn_search')))

search_btn_element.click()

# 3.休眠3秒,保证第一页的内容加载完全

time.sleep(3)

待第一页的数据加载完全之后,可以一直向上滚动页面,直到数据全部被加载完全,数据会由 mitmproxy 自动保存到 MongoDB 数据库当中。

while True:

str1 = self.driver.page_source

self.driver.swipe(FLICK_START_X, FLICK_START_Y + FLICK_DISTANCE, FLICK_START_X, FLICK_START_X)

time.sleep(1)

str2 = self.driver.page_source

if str1 == str2:

print('停止滑动')

# 停止线程

extra_job.stop()

break

print('继续滑动'

结果

首先使用 mitmdump 开启请求监听的服务,然后执行爬取脚本。

App 会自动打开,执行一系列操作后,到达商品界面,然后自动滑动界面,通过 mitmproxy 自动把有用的数据保存到 MongoDB 数据库中。

在当当买了python怎么下载源代码-Python爬取当当网APP数据相关推荐

  1. 教你用python实现34行代码爬取东方财富网信息,爬虫之路,永无止境!!

    教你用python实现34行代码爬取东方财富网信息,爬虫之路,永无止境!! 代码展示: 开发环境: windows10 python3.6 开发工具: pycharm weddriver 库: sel ...

  2. 用python爬取基金网信息数据,保存到表格,并做成四种简单可视化。(爬虫之路,永无止境!)

    用python爬取基金网信息数据,保存到表格,并做成四种简单可视化.(爬虫之路,永无止境!) 上次 2021-07-07写的用python爬取腾讯招聘网岗位信息保存到表格,并做成简单可视化. 有的人留 ...

  3. 在当当买了python怎么下载源代码-Python爬取当当网最受欢迎的 500 本书

    想看好书?想知道哪些书比较多人推荐,最好的方式就是看数据,接下来用 Python 爬取当当网五星图书榜 TOP500 的书籍,或许能给我们参考参考! Python爬取目标 爬取当当网前500本受欢迎的 ...

  4. 在当当买了python怎么下载源代码-Python爬取当当、京东、亚马逊图书信息代码实例...

    注:1.本程序采用MSSQLserver数据库存储,请运行程序前手动修改程序开头处的数据库链接信息 2.需要bs4.requests.pymssql库支持 3.支持多线程 from bs4 impor ...

  5. 在当当买了python怎么下载源代码-python爬虫爬取当当网

    [实例简介]python爬虫爬取当当网 [实例截图] [核心代码] ''' Function: 当当网图书爬虫 Author: Charles 微信公众号: Charles的皮卡丘 ''' impor ...

  6. Python爬虫实战+Scrapy框架 爬取当当网图书信息

    1.环境准备 1.在python虚拟环境终端使用 pip install scrapy下载scrapy依赖库 2.使用scrapy startproject book创建scrapy心目工程 3.使用 ...

  7. python爬取东方财富网资金流向数据(在本地生成csv文件)

    今天我们来试着用python爬取东方财富网资金流向的表格数据. 第一步:程序及应用的准备 首先我们需要安装selenium库,使用命令pip install selenium;然后我们需要下载对应的c ...

  8. python登录网站后爬取数据_如何用 Python 登录主流网站,爬取一些需要的数据

    最近收集了一些网站的登陆方式和爬虫程序,有的通过 selenium 登录,有的则通过抓包直接模拟登录.作者希望该项目能帮助初学者学习各大网站的模拟登陆方式,并爬取一些需要的数据. 作者表示模拟登陆基本 ...

  9. selenium验证码登录_如何用 Python 登录主流网站,爬取一些需要的数据

    最近收集了一些网站的登陆方式和爬虫程序,有的通过 selenium 登录,有的则通过抓包直接模拟登录.作者希望该项目能帮助初学者学习各大网站的模拟登陆方式,并爬取一些需要的数据. 作者表示模拟登陆基本 ...

最新文章

  1. 数据结构编程实战汇总
  2. 从原理到实现,详解基于朴素ML思想的协同过滤推荐算法
  3. mysql 子sql中调用存储过程_mysql 子sql中调用存储过程
  4. shell的执行流控制
  5. python人脸识别opencv_用python和opencv 做人脸识别
  6. Mysql 扩展性设计之Replication,在Mysql具有很相当重要的位置,主从、主主从,你了解他们的背后逻辑吗
  7. 电商 竞品分析_母婴电商类app竞品分析报告
  8. 外贸网站建设(转自xmfish)
  9. 在idea中创建mybatis-config.xml模板(在idea中创建mybatis核心配置文件模板)
  10. asp.net关于上传文件修改文件名的方法
  11. rocketmq稳定可靠性测试
  12. 【论文笔记】Convolutional Neural Networks for Sentence Classification
  13. window.dialogArguments的用法
  14. 台式计算机能装蓝牙吗,台式机如何安装蓝牙
  15. # 2gether 在一起 # 2 号星际碎片现身,全军出击!
  16. ubuntu--ogv格式转mp4格式
  17. 机器学习阶段性总结[机器学习]
  18. GitHub 上受欢迎的 Android UI Library(part_one)
  19. Windows上安装mysql-8.0.29-winx64
  20. Android系统自定义关机充电图标

热门文章

  1. 趣谈网络协议笔记-二(第十九讲)
  2. cassandra框架模型之一——Colum排序,分区策略 Token,Partitioner bloom-filter,HASH
  3. numpy insert
  4. 基于WebSocket协议的iOS端即时聊天
  5. sprintf格式化字符串带来的注入隐患
  6. HTTP Status 500 – Internal Server Error
  7. centos安装时各个版本的含义
  8. C# Keycode对照表
  9. ItemAdding事件接收器中无法取到【创建者】的字段的值
  10. VirtualProtect VirtualLock VirtualUnlock