在爬取有些网站的是后,数据不一定全部是可视化界面的,当我们拖动滚动条时才会加载其他的数据,如果我们也想爬取这部分数据,就需要使用selenium模块,在scrapy里可以结合该模块修改返回对象
一、编写爬虫文件代码
1 import scrapy 2 from selenium import webdriver 3 from wangyi.items import WangyiItem 4 5 6 class TestSpider(scrapy.Spider): 7 name = 'test' 8 # allowed_domains = ['www.xxx.com'] 9 start_urls = ['http://war.163.com/'] 10 11 def __init__(self): 12 self.bro = webdriver.Chrome(executable_path=r'F:爬虫加数据练习第三天chromedriver.exe') 13 14 def parse(self, response): 15 16 div_list = response.xpath('//div[@class="data_row news_article clearfix "]') 17 for div in div_list: 18 item = WangyiItem() 19 title = div.xpath('./div/div/h3/a/text()').extract_first() 20 time = div.xpath('./div/div[2]/span/text()').extract_first() 21 print(title) 22 item['title'] = title 23 item['time'] = time 24 yield item 25 26 def closed(self, spider): 27 print('关闭浏览器对象!') 28 self.bro.quit()
注意,当创建完浏览器对象时,按照以前的写法,我们会直接的解析def parse 方法的返回值response来获取对象,很遗憾这里不是,因为我们要爬取的网页的数据是动态加载的,所有我们需要在middlewares.py文件改变他的返回对象response,所以说上面的response是我们改变之后的返回对象
二、修改response对象
在中间件里有两个类,SpiderMiddleware 和 DownloaderMiddleware,这里修改的是 DownloaderMiddleware 下的 def process_response,具体原理可以看看 scrapy 的五大核心组件
修改代码
1 from scrapy.http import HtmlResponse 2 def process_response(self, request, response, spider): 3 # Called with the response returned from the downloader. 4 5 # Must either; 6 # - return a Response object 7 # - return a Request object 8 # - or raise IgnoreRequest 9 bro = spider.bro 10 bro.get(url=request.url) 11 sleep(3) 12 # 获取爬取的数据 13 page_text = bro.page_source 14 sleep(3) 15 16 return HtmlResponse(url=spider.bro.current_url, body=page_text, encoding='utf8', request=request)
spider 是爬虫文件的对象,spider.bro是初始化创建的浏览器对象,request.url 是起始地址 和下面的spider.bro.current_url 是同一个地址,最终返回修改后的response
返回值后就可以对数据进行解析,获取对应的数据,
三、将获取的数据做持久化存储,
在前几篇介绍过,这里不重复写
四、修改配置文件
DOWNLOADER_MIDDLEWARES = { 'wangyi.middlewares.WangyiDownloaderMiddleware': 543, }