python scrapy scrapy-Splash爬取JS渲染网站

2023-10-08249

1、python和scrapy安装,之前有介绍或者网上有很多方法,这里就不说了。

2、splash安装需要docker,docker安装也不说了,最好是linux下,windows下装docker也很麻烦,可以windows下装个虚拟机比如VMware然后装linux,再装docker

(1)pull splash镜像

sudo docker pull scrapinghub/splash

(2)运行splash的docker服务,并通过浏览器访问8050端口验证安装是否成功

  • 前台运行 sudo docker run -p 8050:8050 scrapinghub/splash
  • 后台运行 sudo docker run -d -p 8050:8050 scrapinghub/splash

3、安装Scrapy-Splash

pip install scrapy_splash

4、scrapy创建项目和爬虫

scrapy startproject 项目名称

scrapy genspider 爬虫名 爬虫的地址

5、在项目的settings.py中做如下配置,其中SPLASH_URL指定了刚刚启动的Splash服务地址

SPLASH_URL = 'http://localhost:8050'

DOWNLOADER_MIDDLEWARES = {    

'scrapy_splash.SplashCookiesMiddleware': 723,   

 'scrapy_splash.SplashMiddleware': 725,   

'scrapy.downloadermiddlewares.httpcompression.HttpCompressionMiddleware': 810,

}

SPIDER_MIDDLEWARES = {    'scrapy_splash.SplashDeduplicateArgsMiddleware': 100,}

DUPEFILTER_CLASS = 'scrapy_splash.SplashAwareDupeFilter'

#这个就是防止robots.txt不让爬取

ROBOTSTXT_OBEY = False

6、在爬虫文件里import scrapy下面加入

from scrapy_splash import SplashRequest

import sys

reload(sys)

sys.setdefaultencoding('utf8')

7、虫文件完整代码,这个是把抓取的渲染后的代码存到HTML里

import scrapy

from scrapy_splash import SplashRequest

import sys

reload(sys)

sys.setdefaultencoding('utf8')

class Hehe1Spider(scrapy.Spider):

    name = 'hehe1'

    allowed_domains = ['cs.xxx.com']

    start_urls = ['http://cs.xxx.com/product?id=1']

    def start_requests(self):

        yield SplashRequest(self.start_urls[0],

                            callback=self.parse_splash,

                            args={'wait': 5}, # 最大超时时间,单位:秒

                            endpoint='render.html') # 使用splash服务的固定参数

    def parse_splash(self, response):

        with open('with_splash.html', 'w') as f:

            f.write(response.body.decode())

8、注意上面的代码Request换成了SplashRequest,第一个参数是采集的网址、第二个参数是返回的方法也就是下面的parse_splash。









下一篇:python scrapy框架