环境:python2.7+scrapy+selenium+PhantomJS

内容:测试scrapy+PhantomJS

爬去内容:涉及到js加载更多的页面

原理:配置文件打开中间件+修改process_request函数(在里面增加PhantomJS操作)

第一步:

settings.py

DOWNLOADER_MIDDLEWARES = {
'dbdm.middlewares.DbdmSpiderMiddleware': 543,
}

项目不一样名字会改变不影响。

第二步:

----------默认开启PhantomJS

middlewares.py

上面需要加载selenium 
from selenium import webdriver
#........省略部分代码
@classmethod
def process_request(cls, request, spider):
#if request.meta.has_key('PhantomJS'):
driver = webdriver.PhantomJS('E:\\p_python\\Scripts\\phantomjs\\bin\\phantomjs.exe')
driver.get(request.url)
if request.url=='https://movie.douban.com/tag':
driver.find_element_by_xpath('//*[@id="app"]/div/div[1]/div[1]/ul[1]/li[5]/span').click()
time.sleep(5)
if driver.find_element_by_xpath('//*[@id="app"]/div/div[1]/a'):
click_more(driver)
content = driver.page_source.encode('utf-8')
#print content
#file = open(path.join(d, '1.txt'),'w')
#file.write(content)
#file.close()
driver.quit()
return HtmlResponse(request.url, encoding='utf-8', body=content, request=request)
def click_more(driver,i=1):
driver.find_element_by_xpath('//*[@id="app"]/div/div[1]/a').click()
print str(i)+' click'
time.sleep(5)
i = i+1
try:
more_btn = driver.find_element_by_xpath('//*[@id="app"]/div/div[1]/a')
if more_btn:
click_more(driver,i)
except:
print 'click Over!!'

上面只是测试的代码,具体根据自己的项目更改,当前默认是打开PhantomJS访问url,可以通过判断。

-----------需要开启时再开启

判断key的值


上面需要加载selenium 
from selenium import webdriver
#........省略部分代码 
@classmethod
def process_request(cls, request, spider):
if request.meta.has_key('PhantomJS'):
driver = webdriver.PhantomJS('E:\\p_python\\Scripts\\phantomjs\\bin\\phantomjs.exe')
driver.get(request.url)
content = driver.page_source.encode('utf-8')
driver.quit()
return HtmlResponse(request.url, encoding='utf-8', body=content, request=request)

key的值设定在spider文件里面

import scrapy
from scrapy.linkextractors import LinkExtractor
from scrapy.spiders import CrawlSpider, Rule
from phantomjs_test.items import PhantomscrapyItem class PhantomjsTestSpider(CrawlSpider):
name = 'phantomjs_test'
allowed_domains = ['book.com']
start_urls = ['http://book.com/']
#all_urls = [] 去重似乎不需要
rules = (
###获取所有的分页列表
Rule(LinkExtractor(allow=r'/story/p/[2-9]*'), callback='parse', follow=True),
###获取里面所有的详情页
#Rule(LinkExtractor(allow=r'/detail/p/[2-9]*'), callback = 'parse_item',follow=True),
) ###从分页页面获取所有的文章url
def parse(self, response):
url_list = response.xpath('/a/@href').extract()
for url in url_list:
request = Request(url=url, callback=self.parse_item, dont_filter=True)
request.meta['PhantomJS'] = True
yield request def parse_item(self, response):
item = PhantomscrapyItem()
#i['domain_id'] = response.xpath('//input[@id="sid"]/@value').extract()
#i['name'] = response.xpath('//div[@id="name"]').extract()
#i['description'] = response.xpath('//div[@id="description"]').extract()
item['bookName'] = response.xpath()
items = []
items.append(item)
return items

以上便是默认打开与判断条件再打开的区别,根据页面不同可以设置,代码仍需要完善才能人性化。

scrapy使用PhantomJS爬取数据的更多相关文章

  1. Scrapy持久化存储-爬取数据转义

    Scrapy持久化存储 爬虫爬取数据转义问题 使用这种格式,会自动帮我们转义 'insert into wen values(%s,%s)',(item['title'],item['content' ...

  2. Python使用Scrapy框架爬取数据存入CSV文件(Python爬虫实战4)

    1. Scrapy框架 Scrapy是python下实现爬虫功能的框架,能够将数据解析.数据处理.数据存储合为一体功能的爬虫框架. 2. Scrapy安装 1. 安装依赖包 yum install g ...

  3. 安居客scrapy房产信息爬取到数据可视化(下)-可视化代码

    接上篇:安居客scrapy房产信息爬取到数据可视化(下)-可视化代码,可视化的实现~ 先看看保存的数据吧~ 本人之前都是习惯把爬到的数据保存到本地json文件, 这次保存到数据库后发现使用mongod ...

  4. 安居客scrapy房产信息爬取到数据可视化(上)-scrapy爬虫

    出发点 想做一个地图热力图,发现安居客房产数据有我要的特性.emmm,那就尝试一次好了~ 老规矩,从爬虫,从拿到数据开始... scrapy的配置 创建一个项目(在命令行下敲~): scrapy st ...

  5. scrapy爬取数据的基本流程及url地址拼接

    说明:初学者,整理后方便能及时完善,冗余之处请多提建议,感谢!   了解内容: Scrapy :抓取数据的爬虫框架     异步与非阻塞的区别   异步:指的是整个过程,中间如果是非阻塞的,那就是异步 ...

  6. 如何提升scrapy爬取数据的效率

    在配置文件中修改相关参数: 增加并发 默认的scrapy开启的并发线程为32个,可以适当的进行增加,再配置文件中修改CONCURRENT_REQUESTS = 100值为100,并发设置成了为100. ...

  7. 爬虫必知必会(6)_提升scrapy框架爬取数据的效率之配置篇

    如何提升scrapy爬取数据的效率:只需要将如下五个步骤配置在配置文件中即可 增加并发:默认scrapy开启的并发线程为32个,可以适当进行增加.在settings配置文件中修改CONCURRENT_ ...

  8. selenium+BeautifulSoup+phantomjs爬取新浪新闻

    一 下载phantomjs,把phantomjs.exe的文件路径加到环境变量中,也可以phantomjs.exe拷贝到一个已存在的环境变量路径中,比如我用的anaconda,我把phantomjs. ...

  9. 借助Chrome和插件爬取数据

    工具 Chrome浏览器 TamperMonkey ReRes Chrome浏览器 chrome浏览器是目前最受欢迎的浏览器,没有之一,它兼容大部分的w3c标准和ecma标准,对于前端工程师在开发过程 ...

随机推荐

  1. react-native从开始趟的坑

    好多天没更了..... 之前用的华为手机老人机真机调试的,最近几天换了小米,又遇上了坑... 跟之前所有手机一样打开开发者模式,开发者模式是(关于手机--版本号---一直点啊点--退出---辅助功能里 ...

  2. 探索版 webstorm快捷方式

    ctrl + alt + s            打开配置面板 Settings   国内的资料比较少,大概很多人已经放弃了原生快捷方式,不过我打算通关原生快捷方式.   在配置面板中  IDE S ...

  3. 使用邮件激活授权/ LightningChart license

    在无网络连接的情况下,可以采用邮件的方式激活授权. 先打开License Manager,然后选 Activate/Deactivate via email, 如下图所示: 此邮件将自动发送到 lic ...

  4. 命令行保存指定目录文件的名字(可包含文件夹文字)到txt文本文件

    Microsoft Visual Studio中配置OpenCV解决方案属性的时候, 需要将OpenCV的lib扩展名的库文件添加到属性的依赖列表里面,网上的有些人博客里面直接给出的会有问题(但大多数 ...

  5. C#复习资料

    C#期末考试复习题 一.单项选择题(每小题2分,共20分) 1.在类作用域中能够通过直接使用该类的(   )成员名进行访问. A. 私有      B. 公用      C. 保护      D. 任 ...

  6. Python 练习冊,每天一个小程序

    Python 练习冊,每天一个小程序 说明:     Github 原文地址: 点击打开链接 Python 练习冊.每天一个小程序.注:将 Python 换成其它语言,大多数题目也试用 不会出现诸如「 ...

  7. 相似QQ对话框上下部分可拖动代码

    <!DOCTYPE html> <html> <head> <meta http-equiv="Content-Type" content ...

  8. C# 文件去仅仅读工具-线程-技术&amp;分享

    using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; usin ...

  9. 在Docker中运行asp.net core 跨平台应用程序

    概述 Docker已经热了有一两年了,而且我相信这不是一个昙花一现的技术,而是一个将深远影响我们日后开发和部署.运营应用系统的一种创新(很多人将其作为devops的一种非常重要的基石).学习docke ...

  10. effective java笔记之java服务提供者框架

    博主是一名苦逼的大四实习生,现在java从业人员越来越多,面对的竞争越来越大,还没走出校园,就TM可能面临失业,而且对那些增删改查的业务毫无兴趣,于是决定提升自己,在实习期间的时间还是很充裕的,期间自 ...