一般遇到动态加载的网页就比较棘手,一般采用scrapy_splash和selenium这两种方式来解决。貌似scrapy_splash更强大,因为就从爬取美团这个网站而言,scrapy_splash可以实现,selenium没有实现。可能selenium没有设置对吧,按理说都应该可以的。

首先需要你安装scrapy_splash,需要用到docker。教程在网上自己找。很简单。两个命令的事,前提是你在linux环境下。安装好之后访问:http://127.0.0.1:8050/

安装模块 pip3 install scrapy-splash

scrapy-splash需要些lua脚本。比如加一些参数,请求头之类的。具体语法百度吧,我也不太清楚。

创建好项目之后。需要在setting中设置几个参数:

DOWNLOADER_MIDDLEWARES = {
#scrapy_splash相关的中间件
'scrapy_splash.SplashCookiesMiddleware': 723,
'scrapy_splash.SplashMiddleware': 725,
'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,
}
SPIDER_MIDDLEWARES = {
'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,
}
#'scrapy_splash的去重的类
DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'
# 最后配置一个Cache存储HTTPCACHE_STORAGE
HTTPCACHE_STORAGE = 'scrapy_splash.SplashAwareFSCacheStorage'
#地址
SPLASH_URL = 'http://localhost:8050'

然后开始写爬虫程序,也很简单,就是SplashRequest请求。然后指定需要执行的脚本。就会返回动态加载完成的页面。

# -*- coding: utf-8 -*-
import scrapy
from selenium import webdriver
import time
from scrapy_splash import SplashRequest
script = """
function main(splash, args)
assert(splash:wait(0.5))
splash:set_custom_headers({
['Accept'] = '*/*',
['Accept-Language'] = 'zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2',
['Cache-Control'] = 'max-age=0',
['Connection'] = 'keep-alive',
['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
})
splash.private_mode_enabled = false
assert(splash:go(args.url))
assert(splash:wait(10))
return {
html = splash:html(),
png = splash:png(),
har = splash:har(),
}
end
""" class MeituanspiderSpider(scrapy.Spider):
name = 'meituanSpider'
# allowed_domains = ['zz.meituan.com']
start_urls = ['http://zz.meituan.com/meishi/pn/'] def start_requests(self):
yield SplashRequest(self.start_urls[0], callback=self.parse, endpoint='execute',
args={'lua_source': script, 'wait': 7}) def parse(self, response):
# 店铺名字
list=response.xpath('//*[@id="app"]/section/div/div[2]/div[2]/div[1]/ul/li/div[2]/a/h4/text()').extract()
for i in list :
print(i)

如果不写脚本的话,是不会成功的,可能美团那边做了限制,脚本也很简单,就是加一些请求头。

scrapy_splash模块解析动态js的更多相关文章

  1. 深入浅出Node.js---Connect模块解析 。转载

    文章地址:https://blog.csdn.net/zhangyuan19880606/article/details/51509205 1 Connect模块背景 Node.js的愿望是成为一个能 ...

  2. webpack模块解析

    前面的话 在web存在多种支持JavaScript模块化的工具(如requirejs和r.js),这些工具各有优势和限制.webpack基于从这些系统获得的经验教训,并将模块的概念应用于项目中的任何文 ...

  3. TypeScript和Node模块解析策略

    一般我们在模块化编码时,总会导入其它模块,通常我们使用如下语法: import { A } from './a'; // ES6语法 import { A } from 'a'; var A = re ...

  4. 深入解析Backbone.js框架的依赖库Underscore.js的作用

    这篇文章主要介绍了深入解析Backbone.js框架的依赖库Underscore.js的作用,用过Node.js的朋友对Underscore一定不会陌生:)需要的朋友可以参考下 backbone必须依 ...

  5. webpack-Module Resolution(模块解析)

    模块解析(Module Resolution) resolver 是一个库(library),用于帮助找到模块的绝对路径.一个模块可以作为另一个模块的依赖模块,然后被后者引用,如下: import f ...

  6. Angular中懒加载一个模块并动态创建显示该模块下声明的组件

    angular中支持可以通过路由来懒加载某些页面模块已达到减少首屏尺寸, 提高首屏加载速度的目的. 但是这种通过路由的方式有时候是无法满足需求的. 比如, 点击一个按钮后显示一行工具栏, 这个工具栏组 ...

  7. Connect模块解析

    Connect模块背景 Node.js的愿望是成为一个能构建高速,可伸缩的网络应用的平台,它本身具有基于事件,异步,非阻塞,回调等特性,这在前几篇专栏中有过描述. 正是基于这样的一些特性,Node.j ...

  8. Python之路-python(面向对象进阶(模块的动态导入、断言、Socket Server))

    模块的动态导入 断言 Socket Server 一.模块的动态导入 class C(object): def __init__(self): self.name = "zhangsan&q ...

  9. TypeScript 素描 - 模块解析、声明合并

    模块解析 模块解析有两种方式 相对方式  也就是以/或 ./或-/开头的,比如import jq  from "/jq" 非相对方式  比如 import model  from ...

随机推荐

  1. POI Excel 单元格内容类型判断并取值

    个人用到的 String birthdayVal = null;                                                                     ...

  2. BZOJ4482[Jsoi2015]套娃——贪心+set

    题目描述 [故事背景] 刚从俄罗斯旅游回来的JYY买了很多很多好看的套娃作为纪念品!比如右 图就是一套他最喜欢的套娃J.JYY由于太过激动,把所有的套娃全 部都打开了.而由于很多套娃长得过于相像,JY ...

  3. 洛谷P2822 组合数问题

    输入输出样例 输入样例#1: 1 2 3 3 输出样例#1: 1 输入样例#2: 2 5 4 5 6 7 输出样例#2: 0 7 说明 [样例1说明] 在所有可能的情况中,只有C_2^1 = 2C21 ...

  4. FPGA中亚稳态相关问题及跨时钟域处理

    前言 触发器输入端口的数据在时间窗口内发生变化,会导致时序违例.触发器的输出在一段时间内徘徊在一个中间电平,既不是0也不是1.这段时间称为决断时间(resolution time).经过resolut ...

  5. [USACO07JAN]Cow School

    题目链接:[USACO07JAN]Cow School 一开始还以为是一道分数规划,后来发现自己看错题了, 然后成功入坑 题目是要求先按照$t_i/p_i$从小到大排序,然后删除前$d$个后求出剩下的 ...

  6. nginx+php使用open_basedir限制站点目录防止跨站

    以下三种设置方法均需要PHP版本为5.3或者以上.方法1)在Nginx配置文件中加入 fastcgi_param PHP_VALUE "open_basedir=$document_root ...

  7. MT【295】线段比的仿射变换

    已知$F_1,F_2$分别为椭圆$\dfrac{x^2}{4}+\dfrac{y^2}{3}=1$的左右焦点.$A,B,C$是椭圆上$x$轴上方的三点,且$AF_1//BO//CF_2$,则$\dfr ...

  8. MT【257】任意存在并存

    函数$f(x)=\dfrac{4x}{x+1}(x>0),g(x)=\dfrac{1}{2}(|x-a|-|x-b|),(a<b)$, 若对任意$x_1>0$,存在$x_2\le x ...

  9. CodeForces 97 E. Leaders(点双连通分量 + 倍增)

    题意 给你一个有 \(n\) 个点 \(m\) 条边的无向图,有 \(q\) 次询问,每次询问两个点 \(u, v\) 之间是否存在长度为奇数的简单路径. \(1 \le n, m, q \le 10 ...

  10. 诶西,JavaScript学习记录。。。。。。

    由于大学课程缘故,老师巨爱叫人问问题,还记分呢,随便记录一下Js的学习情况,以后复习什么的也比较方便吧...... 开始咯,就按照C语言学习那样的方法来吧! ===================== ...