Python怎么爬取当当网APP数据

技术Python怎么爬取当当网APP数据本篇文章给大家分享的是有关Python怎么爬取当当网APP数据,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。目标场景

这篇文章是关于Python如何抓取当当APP数据的,边肖觉得挺实用的,所以想分享给大家学习。希望大家看完这篇文章能有所收获。话不多说,让我们和边肖一起看看。

场景

目标

:有时由于传统的抓取一些网页或应用的方法,由于对方的反抓取方案,很难抓取到想要的数据。此时,我们可以考虑使用“Appium”结合“mitmproxy”来抓取数据。

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

今天的目标是抓取当当的所有数据,保存在MongoDB数据库中。

准备工作

首先,应该在PC上安装Charles和Appium Desktop,并配置mitmproxy环境。

#安装mitmproxy依赖包。

pip3installmitmproxy

#安装pymongodb。

Pip3installpymongo此外,还需要准备一部安卓手机,在PC上配置安卓开发环境。

爬取思路

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

打开当当网的产品搜索页面,搜索关键字“Python”,在Charles中可以看到当前请求的URL地址包括:“word=Python”。

Python怎么爬取当当网APP数据

编写mitmproxy的脚本文件,重写response()函数,过滤请求的URL,整理出有用的数据保存在MongoDB数据库中。

classDangDangMongo(对象):

'''

初始化MongoDB数据库。

'''

def__init__(self):

self . client=Mongoclient(' localhost ')

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

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

self .当当_book_collection=self.db['当当_book']

defresponse(流):

#过滤请求的网址。

if ' keyword=Python ' in request . URL :

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

#书

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

product_datas=[]

for production in product cts 3360

#图书编号

product_id=product.get('id ')

(=NationalBureauofStandards)国家标准局

p;       # 书名
            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,并启动服务。

Python怎么爬取当当网APP数据

获取到包名和初始 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 元素。

Python怎么爬取当当网APP数据

第一次打开应用的时候,可能会出现红包雨对话框、新人专享红包对话框、切换城市对话框,这里需要通过元素 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怎么爬取当当网APP数据

Python怎么爬取当当网APP数据

以上就是Python怎么爬取当当网APP数据,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注行业资讯频道。

内容来源网络,如有侵权,联系删除,本文地址:https://www.230890.com/zhan/49015.html

(0)

相关推荐

  • 我为妈妈做件事作文,帮妈妈擦地作文50个字

    技术我为妈妈做件事作文,帮妈妈擦地作文50个字范文我为妈妈做件事作文:5月9日是母亲节,老师布置了“帮妈妈做一件事”的作业。我不知道该帮妈妈做什么事,就去问爸爸,爸爸说:“可以帮妈妈洗洗碗,或者帮妈妈捶捶背。”我又去问妈

    生活 2021年10月23日
  • 如何实现web微前端沙箱

    技术如何实现web微前端沙箱这篇文章主要讲解了“如何实现web微前端沙箱”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“如何实现web微前端沙箱”吧!背景应用沙箱可能是微前

    攻略 2021年11月15日
  • 草木灰是什么,草木灰都有什么化学成分

    技术草木灰是什么,草木灰都有什么化学成分草木灰都有什么化学成分?要回答这个问题,得弄懂如下几个问题草木灰是什么。1、什么叫草木灰?2、草木灰的化学成分;3、草木灰的性质是什么?4、如何使用草木灰?
    一、什么叫草木灰?草木

    生活 2021年10月23日
  • 上传附件,请问视频文件能上传附件吗

    技术上传附件,请问视频文件能上传附件吗可以进行压缩后再上传。方法如下上传附件:1、首先将自己需要压缩的视频文件准备好,放置到同一个文件夹中,方便添加文件。
    2、将视频压缩软件安装到自己的电脑中,打开软件找到视频压缩,点击

    生活 2021年10月25日
  • 大数据爬虫应用场景(大数据爬虫分析系统)

    技术大数据爬虫安装的示例分析这篇文章主要介绍大数据爬虫安装的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!爬虫安装前准备工作:大数据平台安装完成、zookeeper、redis、elast

    攻略 2021年12月20日
  • 什么是大陆架,什么是大陆架划界的公平原则

    技术什么是大陆架,什么是大陆架划界的公平原则大陆架划界的公平原则是划界的基础公平原则要求在划界中不仅必须采用公平的划界方法,而且必须达成公平的划界结果。具体要求是什么是大陆架:第一,参与划界各方必须有协议。这是一般国际法

    生活 2021年10月24日