使用Scrapy-Splash实现淘宝免密登录

使用Scrapy-Splash实现淘宝免密登录:

众所周知,淘宝的反爬能力较强,笔者试过屏蔽浏览器webdriver但效果不佳,因此另辟蹊径采取cookies免密登录爬取淘宝信息。

创建爬虫后核心代码如下:

    def get_cookies(self,fp):
        with open(fp,"r") as f:
            cookies = json.load(f)
        for cookie in cookies:
            if "expiry" in cookie.keys():
                cookie.pop("expiry")
        return cookies

	def start_requests(self):
        splash_url=self.settings.get('SPLASH_URL')
        if self.flag == 1:
            cookies = self.get_cookies(self.settings.get('COOKIES_PATH'))
            self.flag=0
        for keyword in self.settings.get('KEYWORDS'):
            for page in range(1,self.settings.get('MAX_PAGE')+1):
                if page == 1:
                    url = self.base_url + quote(keyword)
                else:   
                    url = self.base_url + quote(keyword)+'&' + urlencode({'s':44*(page-1)})
                yield SplashRequest(url=url,callback=self.parse,
                                    endpoint='execute',
                                    splash_url=splash_url,
                                    args={'lua_source':script,'wait':5,'cookies':cookies})

笔者使用另一个程序来驱动chrome先登录淘宝获取cookies保存到本地,然后使用该爬虫读取cookies,正如get_cookies()所示。由于Splash中没有expiry这个参数,而有expires这个参数,且这个需要一定的步骤才能转为被Splash识别的参数,因此这里选择直接去除expiry参数,爬取结果不会受影响。

start_requests()设置flag来只读取一次本地cookies,然后根据淘宝搜索关键字产生url的规则来构造url并去掉无用的参数。其中keyword是自定义的搜索关键字,MAX_PAGE为爬取的最大页码数,最后构造SplashRequest实例并传参即可。

传入的LUA脚本如下:

script = '''
function main(splash, args)
  splash.images_enabled = false
  assert(splash:go(args.url))
  splash:init_cookies(args.cookies)
  assert(splash:go(args.url))
  assert(splash:wait(args.wait))
  return splash:html()
end
'''

使用init_cookies()来加载cookies然后解析网页,最后返回网页源代码。

Scrapy对接Splash对比Scrapy对接Selenium的优点就是爬取速度更快,但是在爬取次数过多时,有可能会被淘宝短暂封禁,需要过段时间才能爬取,因此采取Scrapy-Splash来爬取时,最好使用代理及使用多个账号建立cookies池来爬取,以极大降低被封禁IP的可能性。

以上是笔者所写的简略爬虫的核心代码,省略了解析网页源代码及存入数据库等代码。若其中有不足之处或有更巧妙的方法,愿大神不吝赐教。

你可能感兴趣的:(使用Scrapy-Splash实现淘宝免密登录)