• Python+Scrapy+Selenium数据采集


    我是好人,一个大大的良民。

    好与坏,关键在于使用者噢!

    Scrapy是一个常用的数据采集工具;

    Selenium是一个浏览器自动化测试工具;

    结合Scrapy对数据的处理机制和Selenium模拟真实浏览器去获取数据(如:自动化登录,自动化翻页等)。可以更好的完成采集。

    About Scrapy

    Scrapy是开发者在网络上用于常用的数据采集工具之一,对于通过API获取数据我们已经司空见惯了,但是有些WebSite还是会为了“性能或者安全”等原因,通过某些技术手段特意避开API传递数据(比如页面静态化,一次性token等)。因此为了能够采集到这些数据,我们可以通过分析站点和标签结构,然后通过借助Scrapy采集数据。

    简单的介绍了Scrapy框架的作用了,那具体如何帮助我们采集数据呢?一起看看Scrapy的结构吧:

    Scrapy的数据流由Scrapy Engine控制,流程如下:

    1. Engine初始化,并从Spider获取请求。
    2. Request入调度器。
    3. 调度器将Request逐一发送给Scrapy Engine消费。
    4. Scrapy Engine通过下载器中间件将请求发送给下载器。
    5. 下载器将用Request获取的页面作为Response结果返回给Scrapy Engine
    6. Scrapy EngineDownloader接收Response并发送给Spider处理(Spider Middleware)。
    7. Spider处理Response并向Scrapy Engine返回Item
    8. Scrapy Engine将处理好的Item发送给Item Pipeline,同时将已处理的信号一同发送给调度器(Scheduler),请求下一个采集请求。

    重复以上步骤处理采集请求,直至Scheduler没有新的Request

    Scrapy安装教程:https://doc.scrapy.org/en/lat...

    Scrapy 项目创建

    今天就以清博大数据作为案例样本,完成自动化登录,自动化搜索以及数据采集。

    在文件根目录执行:

    scrapy startproject qingbo

    然后进入目录 qingbo/ 下执行:

    scrapy genspider crawl gsdata.cn

    得出以下目录:

    qingbo/
        scrapy.cfg            # deploy configuration file
    
        qingbo/             # project's Python module, you'll import your code from here
            __init__.py
    
            items.py          # project items definition file
    
            middlewares.py    # 浏览器的启动和访问方式在这操作
    
            pipelines.py      # 处理好后的数据在这做最后处理
    
            settings.py       # project settings file
    
            spiders/          # a directory where you'll later put your spiders
                __init__.py
                crawl.py      # 访问的连接和爬取后的数据在这里处理

    其实如何在Scrapy结合Selenium最关键就是在middlewares.py

    具体如何封装可以参考下这里:https://www.osgeo.cn/scrapy/t...

    About Selenium

    Selenium是一款开源的自动化测试框架,通过不同的浏览器和平台对Web应用进行校验,目前支持多个语言调用,如:Python、Java、PHP等。

    Selenium 测试直接在浏览器中运行,就像真实用户所做的一样,所以利用这点,可以更好的进行数据采集。

    Python Selenium安装教程:https://selenium-python-zh.re...

    Selenium 案例

    如果没有登录态直接访问 清博大数据的腾讯视频

    不出意外的话,会跳转到登录页需要登录。上面已经提到了Selenium的环境安装,这里就直接上代码啦:

    站点打开

    options = Options()
    options.headless = False
    driver = webdriver.Firefox(options=options)
    driver.get('https://u.gsdata.cn/member/login')
    driver.implicitly_wait(10) # 页面打开需要加载时间,所以建议加个静默等待

    image-20200327102210587

    登录操作

    可以发现两个tab,分别为:二维码登录、清博帐号登录。

    页面已经打开了,如何到清博帐号登录的tab呢?

    这里我们需要了解一下Xpath(XML Path Language),它是一种用来确定XML文档中某部分位置的语言。

    简单的说,就是我们可以用Xpath对“清博帐号登录”这个Tab进行定位

    image-20200327111331243

    driver.find_element_by_xpath(".//div[@class='loginModal-content']/div/a[2]").click()

    然后定位到账号密码框,填入信息:

    driver.find_element_by_xpath(".//input[@name='username']").send_keys("username")
    driver.find_element_by_xpath(".//input[@name='password']").send_keys("password")

    最后点击登录按钮:

    driver.find_element_by_xpath(".//div/button[@class='loginform-btn']").click()
    driver.implicitly_wait(5)

    image-20200327112059788

    登录成功!~

    查询操作

    driver.get('http://www.gsdata.cn/')
    driver.find_element_by_xpath(".//input[@id='search_input']").send_keys("腾讯视频")
    driver.find_element_by_xpath(".//button[@class='btn no btn-default fl search_wx']").click()
    driver.implicitly_wait(5)

    image-20200327112437222

    在搜索后得出以下结果:

    image-20200327112546457

    通过Xpath定位到腾讯视频的a标签,然后点击进入腾讯视频的数据内容页:

    driver.find_element_by_xpath(
        ".//ul[@class='imgword-list']/li[1]/div[@class='img-word']/div[@class='word']/h1/a").click()
    driver.implicitly_wait(5)

    内容页

    image-20200327115153854

    到了这里,惊不惊喜?现在就可以通过Xpath定位并获取需要的内容进行加工啦,就不细说了。

    关闭操作

    driver.close()

    数据获取完,如果没有其他操作了,就可以把浏览器关了。

    总结

    本章介绍了ScrapySelenium的基本概念和大致的使用方法,总的来说,可以帮助我们在解决一些问题的时候提供新的方案和思路。

    Reference

    https://www.cnblogs.com/luozx207/p/9003214.html

    https://kite.com/blog/python/web-scraping-scrapy/

    https://docs.scrapy.org/en/latest/intro/tutorial.html

     
  • 相关阅读:
    自定义文书思路
    传输
    Netty的组件和设计
    第一款Netty应用程序
    Netty异步和事件驱动
    初识MQTT
    TCP/IP协议分层模型
    uni原生插件的开发(安卓)
    uniapp离线打包记录
    日常问题处理:Linux通过设备名称如何查看硬盘SN
  • 原文地址:https://www.cnblogs.com/wilburxu/p/12581049.html
Copyright © 2020-2023  润新知