java爬虫抓取动态网页(scrapy利器之scrapy+json的安装方法和使用方法)
优采云 发布时间: 2021-11-05 11:21java爬虫抓取动态网页(scrapy利器之scrapy+json的安装方法和使用方法)
介绍
Scrapy是爬虫的利器,我就不多说了。
常见的爬虫结合js一般都是用来抓取网页的动态内容,就是通过操作js来获取渲染出来的内容。
现在大部分网站使用ajax+json来获取数据。所以大家都习惯了爬行,第一件事就是抓包,然后找模式抓数据。当然,有时接口加密算法非常复杂,短时间内难以破解。通过js抓取内容相对容易。这时候爬虫结合js可以更直接的达到目的。当然,数据抓取的效率没有直接抓取界面那么快。.
爬虫结合js
目前我知道的结合js的爬虫有以下3种。(如果有什么要补充的,请留言。)
selenium+webdriver(如firefox、chrome等)。这就要求你的系统有相应的浏览器,而且浏览器必须全程打开。说白了,通过浏览器看到的东西都能被抓到。一般在遇到特别复杂的验证码时,这种方法是很有必要的。当然,用浏览器爬取的效率可想而知。
硒+幻影。PhantomJS 是一个 WebKit,它的使用和 webdriver 是一样的,但是它不需要打开浏览器,可以直接在 Linux 服务器上运行,不需要 GUI,非常棒。
飞溅。与上述两种方法相比,具有以下优点。
splash 作为 js 渲染服务,是基于 Twisted 和 QT 开发的轻量级浏览器引擎,提供直接的 http api。快速、轻量的特点,便于进行分布式开发。
Splash和scrapy集成在一起,两者相互兼容,爬取效率更好。
虽然目前只有英文文档,但是已经写得很详细了,仔细阅读可以快速开发。
本文主要介绍第三种爬虫程序的使用。
安装
网上有很多安装,请自行谷歌。
建议按照官网安装方法。但是要注意,因为splash服务需要依赖docker。docker在Ubuntu下的安装方法,需要仔细阅读文档,注意Ubuntu版本。
启动
安装好docker后,官方文档给了docker启动splash容器的命令(docker run -d -p 8050:8050 scrapinghub/splash),但是一定要查阅splash文档了解相关的启动参数。
比如我启动的时候需要指定max-timeout参数。因为我长时间操作js的时候很可能会超过默认的超时时间,以防万一我设置成3600(一小时),但是对于js操作时间不长的同学,注意不要设置max随机-超时。
docker run -d -p 8050:8050 scrapinghub/splash --max-timeout 3600
用
关于scrapy-splash的教程主要来自scrapy-splash github和splash官方文档。另外,给一个我最近写的scrapy-splash代码。代码主要是实现js页面不断切换,然后抓取数据。以下是代码的核心部分。因为splash使用lua脚本来实现js操作,看官方文档和这段代码,基本可以上手splash了。
fly_spider.py
class FlySpider(scrapy.Spider):
name = "FlySpider"
house_pc_index_url='xxxxx'
def __init__(self):
client = MongoClient("mongodb://name:[email protected]:27017/myspace")
db = client.myspace
self.fly = db["fly"]
def start_requests(self):
for x in xrange(0,1):
try:
script = """
function process_one(splash)
splash:runjs("$('#next_title').click()")
splash:wait(1)
local content=splash:evaljs("$('.scrollbar_content').html()")
return content
end
function process_mul(splash,totalPageNum)
local res={}
for i=1,totalPageNum,1 do
res[i]=process_one(splash)
end
return res
end
function main(splash)
splash.resource_timeout = 1800
local tmp=splash:get_cookies()
splash:add_cookie('PHPSESSID', splash.args.cookies['PHPSESSID'],"/", "www.feizhiyi.com")
splash:add_cookie('FEIZHIYI_LOGGED_USER', splash.args.cookies['FEIZHIYI_LOGGED_USER'],"/", "www.feizhiyi.com" )
splash:autoload("http://cdn.bootcss.com/jquery/2.2.3/jquery.min.js")
assert(splash:go{
splash.args.url,
http_method=splash.args.http_method,
headers=splash.args.headers,
})
assert(splash:wait(splash.args.wait) )
return {res=process_mul(splash,100)}
end
"""
agent = random.choice(agents)
print "------cookie---------"
headers={
"User-Agent":agent,
"Referer":"xxxxxxx",
}
splash_args = {
'wait': 3,
"http_method":"GET",
# "images":0,
"timeout":1800,
"render_all":1,
"headers":headers,
'lua_source': script,
"cookies":cookies,
# "proxy":"http://101.200.153.236:8123",
}
yield SplashRequest(self.house_pc_index_url, self.parse_result, endpoint='execute',args=splash_args,dont_filter=True)
# +"&page="+str(x+1)
except Exception, e:
print e.__doc__
print e.message
pass
如果你想更深入地使用scrapy-splash,请研究splash官方文档。另外,欢迎留言交流学习。