一般遇到动态加载的网页就比较棘手,一般采用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. P1035 调和级数

    两种解法如下: 1.模拟 这种做法的思路是枚举n从1开始,直到Sn>k结束,只需要一个循环即可实现. 代码: #include<cstdio> int main() { ; scan ...

  2. PHP require php > 5.3.0

    项目版本要求 在5.3版本以上,如果是用 phpStudy 环境,那么直接切换版本即可

  3. 简单聊聊WebSocket

    一.概述 上一篇文章<浅析一次HTTP请求>我们分析了简单的一次 HTTP 请求具体是怎么样完成的,分析了 HTTP 协议的数据结构,如何连接,如何断开,又是如何多路复用的,那么今天我们来 ...

  4. 【bfs】拯救少林神棍(poj1011)

    Description 乔治拿来一组等长的木棒,将它们随机地砍断,使得每一节木棍的长度都不超过50个长度单位.然后他又想把这些木棍恢复到为裁截前的状态,但忘记了初始时有多少木棒以及木棒的初始长度.请你 ...

  5. NOIP2012疫情控制(二分答案+树上贪心)

    H 国有n个城市,这 n个城市用n-1条双向道路相互连通构成一棵树,1号城市是首都,也是树中的根节点. H国的首都爆发了一种危害性极高的传染病.当局为了控制疫情,不让疫情扩散到边境城市(叶子节点所表示 ...

  6. sscanf、sprintf、stringstream常见用法

    转载自:https://blog.csdn.net/jllongbell/article/details/79092891 前言: 以前没有接触过stringstream这个类的时候,常用的字符串和数 ...

  7. bootstrap学习一

    bootstrap学习 一.css概览: 1.使用HTML5标准,<!DOCTYPE html>. 2.移动设备优先: <meta name="viewport" ...

  8. Centos 6.5 安装和使用docker

    基于本人一贯的习惯,关于“某某某是什么”这样的问题,请百度吧,会有更专业的人士,会比我说的更详细更深,这里我只给出本人亲历的安装和使用过程. 1.安装 先检查服务器环境,docker要求操作系统Cen ...

  9. QML学习笔记(二)-纯qml画图实现canvas画板-鼠标画图

    作者: 狐狸家的鱼 Github: 八至 版权声明:如需转载请获取授权和联系作者 用纯qml实现canvas画板功能,用鼠标进行画图,可以画直线,画圆,画矩形,画弧线. 由于canvas画图会有延迟和 ...

  10. A1040. Longest Symmetric String

    Given a string, you are supposed to output the length of the longest symmetric sub-string. For examp ...