Scrapy笔记 4 ---- Scrapy + selenium

在第一个笔记中,我们在 https://news.qq.com/ 中看到了,进入浏览器中,按住F12 之后出现的网页结构和网页源码并不一致,这样会导致我们的网页内容无法抓取。原因是我们看到的网页是由JS 动态生成,解决这个的方法有很多,其中谷歌公司的 selenium 可以很轻松的帮助我们获取到想要的数据。这里我们重点说一下,如何把selenium 嵌入 scrapy , 从而使我们的功能更加强大。

需配置文件

	- scrapy.py (解析网页文件)
	- middlewares.py
	- setting.py 

在集合这两个框架的时候,我们已经确定在该网站内的网页都是动态加载出来,所以就直接把调用 webdriver 的方法写在这里。

import scrapy
from selenium import webdriver
from scrapy import signals
from scrapy.xlib.pydispatch import dispatcher

class QqnSpider(scrapy.Spider):

    name = 'qqn'
    allowed_domains = ['news.qq.com']
    start_urls = ['http://news.qq.com/']


    def __init__(self):
        '''
        浏览器设置
        '''

        self.browser = webdriver.Chrome(executable_path='/home/happyling/yifwork/newss/nq/tool/chromedriver')

        super(QqnSpider,self).__init__()

        dispatcher.connect(self.spider_closed,signals.spider_closed)

    def spider_closed(self,spider):
        '''
        整个程序运行结束关闭浏览器
        :param spider:  
        :return: 
        '''
        print('close spider')

        self.browser.quit()


    def parse(self, response):


        article = response.xpath('//ul[@class="list"]//li[@class="item cf"]//div[@class="detail"]//text()').extract_first()

        print(article)
	
	
一会如果打印出来结果,说明程序已经达到了预期的效果


  • middlewares.py
    先看一下文件里面本来就有那些东西
    在这里插入图片描述
    可见框架会自动生成一些文件,我们先不调用这些文件,自己加一个新类,如下
from scrapy.http import HtmlResponse


class JSPageMiddleware(object):

    def process_request(self, request, spider):
        '''

        方法中的参数一定不要改,因为这个方法就是来处理request 请求

        :param request:
        :param spider:
        :return:  browser 解析过后的url, 得到的页面给解析函数中的 def parse(self, response) 来处理

        '''
        #  如果是我们需要的项目名称,就会把 spider 里面的 request 带过来
        if spider.name == 'qqn':
            print(request.url)
            # 这里的 spider.browser 会调用我们在解析函数里面写的 webdriver
            spider.browser.get(request.url)

            time.sleep(2)

            return HtmlResponse(url=spider.browser.current_url, body=spider.browser.page_source, encoding='utf-8',
                                request=request)
  • settings.py
    大概55 行左右,加入配置

      DOWNLOADER_MIDDLEWARES = {
      	 # 'nq.middlewares.NqDownloaderMiddleware': 543,
      	   'nq.middlewares.JSPageMiddleware': 4
      	   }
    

这里,就完成我们的工作了,运行一下试一试

		2018-12-27 17:05:52 [selenium.webdriver.remote.remote_connection] DEBUG: DELETE http://127.0.0.1:40656/session/2852c5b6491ef720294808f901da0ebf {"sessionId": "2852c5b6491ef720294808f901da0ebf"}
		武汉一双层公交车撞上限高架被削顶 多名乘客受伤
		close spider
		2018-12-27 17:05:52 [urllib3.connectionpool] DEBUG: http://127.0.0.1:40656 "DELETE /session/2852c5b6491ef720294808f901da0ebf HTTP/1.1" 200 72

输出了文章标题,且在程序结束的时候关闭了浏览器。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值