在第一个笔记中,我们在 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
输出了文章标题,且在程序结束的时候关闭了浏览器。