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 Engine 从 Downloader 接收 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...

扫描二维码关注公众号,回复: 10566774 查看本文章

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) # 页面打开需要加载时间,所以建议加个静默等待

登录操作

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

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

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

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

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)

登录成功!~

查询操作

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)

在搜索后得出以下结果:

通过 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)

内容页

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

关闭操作

driver.close()

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

总结

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

加群:850591259  领取完整代码

发布了5 篇原创文章 · 获赞 0 · 访问量 4242

猜你喜欢

转载自blog.csdn.net/weixin_43881394/article/details/105161819
今日推荐