使用 selenium 爬取动态加载内容

  • 开启中间件

    DOWNLOADER_MIDDLEWARES = {
    'wangyiPro.middlewares.WangyiproDownloaderMiddleware': 543,
    }
  1. 在爬虫文件中 创建 浏览器对象

    使用 爬虫文件的 init 方法

    def __init__(self):
    self.bro = webdriver.Chrome(executable_path=r'C:\Users\old-boy\Desktop\爬虫+数据\爬虫_day04\chromedriver.exe')

    数据解析:

    start_urls = ['http://news.163.com/domestic/']
    .......
    def parse(self, response):
    div_list = response.xpath('//div[@class="ndi_main"]/div')
    for div in div_list:
    title = div.xpath('./div/div[1]/h3/a/text()').extract_first()
    detail_url = div.xpath('./div/div[1]/h3/a/@href').extract_first()
    print(title,detail_url)
  2. 操作在 process_response(self,request,response,spider) 中 编写 浏览器自动化操作

    进行点击 或者 页面滚动

    返回新的 response 对象

    rom time import sleep
    from scrapy.http import HtmlResponse class WangyiproDownloaderMiddleware(object):
    #拦截所有的响应对象
    def process_response(self, request, response, spider):
    # request.url 拦截到响应的 url 判断是否是请求的响应 对象
    # 有些页面 不需要 使用 selenium 直接返回 response
    # 参数spider表示的就是爬虫类的一个对象
    # 使用一个满足需求的新的响应对象替换原有的
    bro = spider.bro # 浏览器对象
    url = spider.start_urls[0]
    bro.get(url)
    bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    sleep(2)
    bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    sleep(2)
    bro.execute_script('window.scrollTo(0,document.body.scrollHeight)')
    sleep(2)
    a_tag = bro.find_elements_by_class_name('load_more_btn')[0]
    a_tag.click()
    sleep(2)
    page_text = bro.page_source
    #实例化一个新的响应对象
    response = HtmlResponse(url=bro.current_url,body=page_text,encoding='utf-8',request=request)
    return response
  3. 关闭 浏览器对象

    • 重写 closed(self,spider):

      def closed(self,spider):
      self.bro.quit()

Scrapy 框架 使用 selenium 爬取动态加载内容的更多相关文章

  1. Python+Selenium爬取动态加载页面(2)

    注: 上一篇<Python+Selenium爬取动态加载页面(1)>讲了基本地如何获取动态页面的数据,这里再讲一个稍微复杂一点的数据获取全国水雨情网.数据的获取过程跟人手动获取过程类似,所 ...

  2. Python+Selenium爬取动态加载页面(1)

    注: 最近有一小任务,需要收集水质和水雨信息,找了两个网站:国家地表水水质自动监测实时数据发布系统和全国水雨情网.由于这两个网站的数据都是动态加载出来的,所以我用了Selenium来完成我的数据获取. ...

  3. 关于使用scrapy框架编写爬虫以及Ajax动态加载问题、反爬问题解决方案

    Python爬虫总结 总的来说,Python爬虫所做的事情分为两个部分,1:将网页的内容全部抓取下来,2:对抓取到的内容和进行解析,得到我们需要的信息. 目前公认比较好用的爬虫框架为Scrapy,而且 ...

  4. 爬虫再探实战(三)———爬取动态加载页面——selenium

    自学python爬虫也快半年了,在目前看来,我面临着三个待解决的爬虫技术方面的问题:动态加载,多线程并发抓取,模拟登陆.目前正在不断学习相关知识.下面简单写一下用selenium处理动态加载页面相关的 ...

  5. 爬虫再探实战(四)———爬取动态加载页面——请求json

    还是上次的那个网站,就是它.现在尝试用另一种办法——直接请求json文件,来获取要抓取的信息. 第一步,检查元素,看图如下: 过滤出JS文件,并找出包含要抓取信息的js文件,之后就是构造request ...

  6. 基于scrapy框架输入关键字爬取有关贴吧帖子

    基于scrapy框架输入关键字爬取有关贴吧帖子 站点分析 首先进入一个贴吧,要想达到输入关键词爬取爬取指定贴吧,必然需要利用搜索引擎 点进看到有四种搜索方式,分别试一次,观察url变化 我们得知: 搜 ...

  7. C#使用phantomjs,爬取AJAX加载完成之后的页面

    1.开发思路:入参根据apiSetting配置文件,分配静态文件存储地址,可实现不同站点的静态页生成功能.静态页生成功能使用无头浏览器生成,生成之后的字符串进行正则替换为固定地址,实现本地正常访问. ...

  8. Win8 Metro动态加载内容框架

    制作背景 为了参加ImagineCup 2013 世界公民类比赛,我们设计制作了一个可动态扩展的幼教类App.这个App需要能动态加载内容,内容包括带动画可交互的电子书,动画,视频,游戏. 技术支持 ...

  9. 在ASP.NET中动态加载内容(用户控件和模板)

    在ASP.NET中动态加载内容(用户控件和模板) 要点: 1. 使用Page.ParseControl 2. 使用base.LoadControl 第一部分:加载模板 下 面是一个模板“<tab ...

随机推荐

  1. c# 使用迭代器来创建可枚举类型

    class Program { public IEnumerator<string> GetEnumerator() { IEnumerable<string> my = Bl ...

  2. mysql中的prepare介绍和应用

    简单的用set或者declare语句定义变量,然后直接作为sql的表名是不行的,mysql会把变量名当作表名.在其他的sql数据库中也是如此,mssql的解决方法是将整条sql语句作为变量,其中穿插变 ...

  3. c# 对JSON字符串排序(KEY/VALUE)

    public string StortJson(string json) { var dic = JsonConvert.DeserializeObject<SortedDictionary&l ...

  4. Reinforcement Learning: An Introduction读书笔记(3)--finite MDPs

     > 目  录 <  Agent–Environment Interface Goals and Rewards Returns and Episodes Policies and Val ...

  5. 我从Angular 2转向Vue.js, 也没有选择React

    译者按: 通过使用Angular的经历,作者已经完全转为Vue粉了!我们Fundebug目前还是用AngularJS 1,坦白说,学习曲线蛮陡的. 原文: Why we moved from Angu ...

  6. 小程序 lazy-load 不生效的问题

    最近在开发家里喵喵的小程序(娱乐),本想抽一小部分时间做个懒加载.看了小程序官网 API,给 image 标签加上 lazy-load 就能实现懒加载.但从微信开发者工具看,似乎并没有生效.搜了一下, ...

  7. blfs(systemd版本)学习笔记-编译安装gnome桌面组件及应用

    我的邮箱地址:zytrenren@163.com欢迎大家交流学习纠错! blfs中的gnome项目地址:http://www.linuxfromscratch.org/blfs/view/stable ...

  8. js 金额补全处理

    function returnFloat(value) { var value = Math.round(parseFloat(value) * 100) / 100; var xsd = value ...

  9. SpringBoot设置文件上传大小限制--默认为1M

    SpringBoot默认上传文件大小不能超过1MB,超过之后会报以下异常:org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeL ...

  10. JS单体内置对象之Math常用方法(min,max,ceil,floor,round,random等)

    1.min()和max()方法 Math.min()用于确定一组数值中的最小值.Math.max()用于确定一组数值中的最大值. alert(Math.min(2,4,3,6,3,8,0,1,3)); ...