博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
动态网站的爬取
阅读量:6568 次
发布时间:2019-06-24

本文共 2388 字,大约阅读时间需要 7 分钟。

介绍

在日常爬取过程中,动态网站的爬取是比较麻烦的,因为动态网站的数据是动态加载的,这时候我们需要用上selenuim中间件去模拟操作,获取动态数据

开始

创建项目

1.scrapy startproject Taobao复制代码
2.cd Taobao复制代码
3. scrapy genspider taobao www.taobao.com复制代码

打开项目

首先我们什么不做来爬取看看,先把setting里面的爬虫规则设置为False

ROBOTSTXT_OBEY = False复制代码

我们在终端输入

scrapy view "http://www.taobao.com"复制代码

这时候会发现爬取到的页面如下所示:

可以发现爬取到的页面是一个空的框架,没有数据,那这时怎么办呢??我们要用到selenuim这个中间件

使用中间件

我们关注下载中间件( TaobaoDownloaderMiddleware)里面的process_request函数 我们添上一行代码看看什么效果:

def process_request(self, request, spider):        # Called for each request that goes through the downloader        # middleware.        # Must either:        # - return None: continue processing this request        # - or return a Response object        # - or return a Request object        # - or raise IgnoreRequest: process_exception() methods of        #   installed downloader middleware will be called        print("------我是中间件,请求经过我------")        return None复制代码

然后在seeting里面,把下面的注释去掉

DOWNLOADER_MIDDLEWARES = {   'Taobao.middlewares.TaobaoDownloaderMiddleware': 543,}复制代码

我们运行一下看看效果:

scrapy view "http://www.taobao.com"复制代码

效果:

------我是中间件,请求经过我------2018-08-29 15:38:21 [scrapy.downloadermiddlewares.redirect] DEBUG: Redirecting (302) to 
from
------我是中间件,请求经过我------2018-08-29 15:38:21 [scrapy.core.engine] DEBUG: Crawled (200)
(referer: None)复制代码

说明中间件是有效果的,如果我们在中间件模拟一些操作,是不是就能获取动态数据呢?

middlewares中间件的操作

首先导入selenium

from selenium import webdriver#无界面运行from selenium.webdriver.chrome.options import Options复制代码

在 process_request函数中写入如下代码

def process_request(self, request, spider):        # Called for each request that goes through the downloader        # middleware.        print("------我是中间件,请求经过我------")        #设置无界面运行        option = Options()        option.add_argument("--headless")        #创建一个driver对象        #driver = webdriver.Chrome()        driver = webdriver.Chrome(chrome_options=option)        #等待15秒        driver.implicitly_wait(15)        driver.get(request.url)        # 让页面滚动最底层 模拟人的操作        js = 'window.scrollTo(0,document.body.scrollHeight)'        # 执行js        driver.execute_script(js)        # 获取内容        content = driver.page_source        from scrapy.http import HtmlResponse        # 创建一个resp对象返回至解析函数        resp = HtmlResponse(request.url,request=request,body=content,encoding='utf-8')        return resp        return None复制代码

好了,这时已经获取到动态数据了,这里就不解析了,以上就是动态网站爬取的思路

转载地址:http://suvjo.baihongyu.com/

你可能感兴趣的文章
BZOJ3799 : 字符串重组
查看>>
数据持久化的复习
查看>>
Util应用程序框架公共操作类(八):Lambda表达式公共操作类(二)
查看>>
thinkphp查询
查看>>
iOS开发-Protocol协议及委托代理(Delegate)传值
查看>>
【BZOJ】1105: [POI2007]石头花园SKA
查看>>
MapReduce原理与设计思想
查看>>
Theano学习笔记(三)——图结构
查看>>
UVa - 11400 - Lighting System Design
查看>>
Oracle 11g 客户端使用
查看>>
luvit 被忽视的lua 高性能框架(仿nodejs)
查看>>
也许每个农村出来的码农都有个田园梦
查看>>
J2EE的13种核心技术
查看>>
Express.js 中的 Sessions 如何工作?(译)
查看>>
Web自动化之Headless Chrome概览
查看>>
【133天】尚学堂高淇Java300集视频精华笔记(71-72)
查看>>
剖析 Laravel 计划任务--事件属性
查看>>
Micronaut教程:如何使用基于JVM的框架构建微服务
查看>>
检查IP是否可用的方法
查看>>
互联网架构师必备技术 Docker仓库与Java应用服务动态发布那些事
查看>>