python3 scrapy 使用PhantomJS作为middlewares爬取动态加载的数据

我们之前一直是获得url返回的数据并进行分析,取得其中需要的内容的
但是有些界面中的数据并不是在一开始就加载完成的,而是通过动态的加载出来的
假如我们有一天头脑发热,要爬取下面这个网址中的内容
https://www.jd.com/error2.aspx

不要问我为什么爬这个,只是举个栗子

然后按照以往的套路开始爬。。。想获取到这个名字
这里写图片描述

然后以为so easy ,开始自信满满写代码
分析界面的结构

这里写图片描述

瞬间写出下面的代码

# -*- coding: utf-8 -*-
import scrapy


class MidSpider(scrapy.Spider):
    name = 'mid'

    start_urls = ['http:////wap.jd.com/category/all.html/']

    def parse(self , response):
        for item in response.css(".mc"):
            title = item.css(".p-name a::text").extract()
            print(title)


然后开始跑爬虫
这里写图片描述
说好的数据去哪了。。。
然后怀疑人生几秒
是不是选择器出问题了,于是开始改,疯狂改。。。。
打印一下response.body.decode()

print(response.body.decode())

打印出来的response.body里居然没有自己需要的信息
发现
这里写图片描述
。。。
这里写图片描述
。。。
居然是不一样的
也就是说class=”w” 的div标签及其内容是在我们请求数据的时候是没有的
。。
然后突然发现
刷新界面的时候一瞬间是这样的
这里写图片描述

果然和我想的一样
没有办法得到数据了,GG 本篇博客结束







当然不是这样了
我们可以使用middleware(中间件)来预加载一下这个界面,获得完整的界面html之后,再取它里面的内容
我们在spiders的同级目录下建一个文件夹,叫做middle
然后在它的下面建一个py文件 myMiddleware.py
在myMiddleware.py文件夹中加入以下内容

from selenium import webdriver
from scrapy.http import HtmlResponse
import time

class JavaScriptMiddleware(object):
    def process_request(self, request, spider):

        if spider.name == "mid":

            driver = webdriver.Chrome("D:\\浏览器代理\chromedriver.exe") #指定使用的浏览器
            driver.get(request.url)
            time.sleep(1)
            js = "var q=document.documentElement.scrollTop=10000" 
            driver.execute_script(js) #可执行js,模仿用户操作。此处为将页面拉至最底端。       
            time.sleep(3)
            body = driver.page_source
            print ("访问"+request.url)
            return HtmlResponse(driver.current_url, body=body, encoding='utf-8', request=request)

        else:
            return None

selenium 是一个 自动化测试的工具,如果你没有这个模块的话可以pip安装一下

pip install selenium

解释一下上面的代码

定义一个JavaScriptMiddleware的类,
定义一个process_request(self, request, spider):的方法
当spider的名字是mid的时候执行。
webdriver是什么呢?
是selenium为我们提供的自动化测试工具,
ctrl+左键查看一下
这里写图片描述
可以使用很多浏览器进行测试
在这里我们使用两个:
Chrome 和 PhantomJS
这里是我放在网盘里的链接,需要的话可以下载一下
链接:http://pan.baidu.com/s/1nv1fYBZ 密码:jokg
下载之后放进一个文件夹待用。
将路径配置一下
定义一个driver 来接收webdriver.Chrome(“D:\浏览器代理\chromedriver.exe”)。
这里需要注意的是D:\\ 是有两个“\”的,

js = "var q=document.documentElement.scrollTop=10000"

这段js代码是模拟浏览界面,将界面活动到距离顶部10000的位置,也就是滑动到界面最下方
剩下的代码应该没什么问题了

想要使用我们自定义的middleware需要在settings.py文件内配置一下,在settings.py文件下配置

DOWNLOADER_MIDDLEWARES = {
    'xxx.middle.myMiddleware.JavaScriptMiddleware':100 ,
}

调用一下我们自定义的middlewares
然后运行代码会弹出一个界面
这里写图片描述
自动测试,几秒后自动关闭,
命令行界面中出现结果
这里写图片描述
成功~

如果不想弹出这个界面的或,可以使用没有界面的PhantomJS作为测试,只需要修改一行代码

driver = webdriver.PhantomJS("D:\\浏览器代理\phantomjs.exe") #指定使用的浏览器

再次运行,等待运行结束后,同样出现结果~
这就是PhantomJS作为middlewares的应用~

项目代码和chromedriver PhantomJS我都放到了github上
https://github.com/dangsh/hive/tree/master/scrapySpider/xxx
https://github.com/dangsh/hive/tree/master/scrapySpider/%E6%B5%8F%E8%A7%88%E5%99%A8%E4%BB%A3%E7%90%86
也可以在这个在git上下载

猜你喜欢

转载自blog.csdn.net/dangsh_/article/details/78633566