2

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

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

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/luozx...

https://kite.com/blog/python/...

https://docs.scrapy.org/en/la...


WilburXu
124 声望29 粉丝

do not go gentle into that good night.