使用scrapy 模拟登陆网站后 抓取会员中心相关信息

来源:互联网 发布:手持数据采集终端 编辑:程序博客网 时间:2024/05/17 06:53

有时候爬取网站的时候需要登录,在Scrapy中可以通过模拟登录保存cookie后再去爬取相应的页面。

重写start_requests方法

要使用cookie,第一步得打开它,默认scrapy使用CookiesMiddleware中间件,并且打开了。如果你之前禁止过,请设置如下

COOKIES_ENABLES = True  

这里我重写了start_requests方法

def start_requests(self):        return [scrapy.Request("http://www.*******.com/login.html",                        meta={'cookiejar': 1}, callback=self.post_login)]

Request指定了cookiejar的元数据,用来往回调函数传递cookie标识。

使用FormRequest

Scrapy为我们准备了FormRequest类专门用来进行Form表单提交的

    def post_login(self,response):        # 登陆成功后, 会调用after_login回调函数,如果url跟Request页面的一样就省略掉        return [scrapy.FormRequest.from_response(response,                  url='http://www.*********.com/index.php?m=login&a=checkLogin',                  meta={'cookiejar': response.meta['cookiejar']},                  headers=self.post_headers,  # 注意此处的headers                  formdata={                      "username": "********",                      "password": "********"                  },                  callback=self.after_login,                  dont_filter=True        )]

FormRequest.from_response()方法让你指定提交的url,请求头还有form表单值,注意我们还通过meta传递了cookie标识。它同样有个回调函数,登录成功后调用。下面我们来实现它

    def after_login(self,response):        return scrapy.Request(            "http://www.*******.com/userindex.html",            meta={'cookiejar': response.meta['cookiejar']},            callback=self.parse_page)

完整代码

# -*- coding: utf-8 -*-import scrapyimport loggingclass LoginSpider(scrapy.Spider):    name = 'login'    post_headers = {        "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",        "Accept-Encoding": "gzip, deflate",        "Accept-Language": "zh-CN,zh;q=0.8,en;q=0.6",        "Cache-Control": "no-cache",        "Connection": "keep-alive",        "Content-Type": "application/x-www-form-urlencoded",        "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.75 Safari/537.36",        "Referer": "http://www.*******.com/",    }    def start_requests(self):        return [scrapy.Request("http://www.*******.com/login.html",                        meta={'cookiejar': 1}, callback=self.post_login)]    def post_login(self,response):        # 登陆成功后, 会调用after_login回调函数,如果url跟Request页面的一样就省略掉        return [scrapy.FormRequest.from_response(response,                  url='http://www.********.com/index.php?m=login&a=checkLogin',                  meta={'cookiejar': response.meta['cookiejar']},                  headers=self.post_headers,  # 注意此处的headers                  formdata={                      "username": "********",                      "password": "********"                  },                  callback=self.after_login,                  dont_filter=True        )]    def after_login(self,response):        return scrapy.Request(            "http://www.********.com/userindex.html",            meta={'cookiejar': response.meta['cookiejar']},            callback=self.parse_page)    def parse_page(self,response):        logging.info(u'--------------消息分割线-----------------')        mey_num = response.xpath('//span[@class="mey_num"]/text()').extract()[0]        self.logger.info("my money %s", "------***------"+mey_num)
阅读全文
0 0
原创粉丝点击