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

本文介绍了如何在Scrapy中进行模拟登录,首先重写start_requests方法以开启cookie,然后利用FormRequest进行表单提交,通过from_response方法指定URL、请求头和表单数据,并使用meta传递cookie信息。登录成功后,可继续抓取会员中心的相关信息。

有时候爬取网站的时候需要登录,在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 scrapy
import logging
class 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)
Scrapy是一个强大的Python网络爬虫框架,它可以帮助开发者抓取网站数据。模拟登录Scrapy的过程通常涉及以下几个步骤: 1. **设置请求头**:为了模拟真实用户,需要设置合适的User-Agent、Cookie等请求头信息。这可以防止目标站点识别出是爬虫。 ```python headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.3' } ``` 2. **创建登录请求**:创建一个登录页面的GET请求,获取初始的登录表单数据,如CSRF Token等。 ```python response = requests.get(login_url, headers=headers) login_form_data = dict(response.form.fields) ``` 3. **构造POST数据**:根据登录页面的HTML结构,填充用户名、密码和其他必填字段,并加入之前获取到的CSRF Token。 ```python data = { 'username': username, 'password': password, # 根据实际页面填写其他字段 'csrfmiddlewaretoken': login_form_data['csrfmiddlewaretoken'] } ``` 4. **发送登录请求**:使用Scrapy的`FormRequest`类发送POST登录请求。 ```python form_request = FormRequest( url=login_url, method='POST', formdata=data, headers=headers, callback=self.handle_login_response, dont_filter=True, # 防止Spider从过滤列表中移除 ) ``` 5. **处理响应**:定义`handle_login_response`函数来检查登录是否成功,如果成功,你可以继续抓取需要的数据;如果失败,则需要分析错误原因并尝试修复。 ```python def handle_login_response(self, response): if 'You are logged in.' in response.text: # 登录成功,开始抓取内容 self.crawl_urls_to_scrape() else: # 处理登录失败情况... ``` 6. **添加登录请求到Spiders**:在Scrapy Spider中,将登录请求添加到待抓取队列中。 ```python spider = MySpider() spider.start_requests.append(form_request) ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值