java爬虫抓取动态网页(scrapy利器之scrapy+json的安装方法和使用方法)

优采云 发布时间: 2021-11-05 11:21

  java爬虫抓取动态网页(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官方文档。另外,欢迎留言交流学习。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线