scrapy抓取登陆页面

经常在爬有些网站的时候需要登录,大多数网站需要你提供一个用户名和密码,在这种情况下,需要先向网站发送一个POST请求。可以使用Scrapy的FormRequest类,这个类和Request类很相似,只是多了一个extra参数,用这个参数可以传递表单数据。要使用这个类,先导入:
方法1:

from scrapy.http import FormRequest

然后把start_urls替换成start_requests()方法,因为在这种情况下需要的不仅仅是一些URL(start_requests()方法的默认行为是从start_urls取出URL发出请求)。

在start_requests()方法中创建并返回一个FormRequest:

# Start with a login request
def start_requests(self):
    return [
        FormRequest(
        "http://web:9312/dynamic/login",
        formdata={"user": "user", "pass": "pass"}
        )]

from_response()方法包含了表单所有的包括隐藏的域,我们需要做的仅仅是用formdata参数填充user和pass域并返回FormRequest对象即可。相关代码如下:

# Start on the welcome page
def start_requests(self):
    return [
        Request(
            "http://web:9312/dynamic/nonce", callback=self.parse_welcome)
    ]
# Post welcome page's first form with the given user/pass
    def parse_welcome(self, response):
        return FormRequest.from_response(
            response,
            formdata={"user": "user", "pass": "pass"}
        )

方法2:

# coding=utf-8
import scrapy
from scrapy.selector import Selector

class LoginSpidersPyw(scrapy.Spider):
    #scrapy crawl LoginSpiders 定义爬虫的名称
    name = "LoginSpiders"
    #定义允许抓取的域名,如果不是在此列表的域名则放弃抓取
    allowed_domains = ['pyw.cn']
    #登录网址
    LoginUrl="http://v.pyw.cn/login/index"
    #登录验证接口
    LoginCheckUrl="http://v.pyw.cn/login/check"
    #所要爬取的网址
    start_urls=["http://v.pyw.cn/Data/accountdetail/1",
                "http://v.pyw.cn/Data/accountdetail/2",
                "http://v.pyw.cn/Data/accountdetail/3",
                "http://v.pyw.cn/Data/accountdetail/4"]
    #登录数据:用户名、用户密码、是否记住用户名
    formdata = {
        "username": "15880xxxxxx",
        "password": "a123456",
        "remember": "1"
    }
    #记录当前属于第几笔记录,累计
    PageIndex=0
    #重写爬虫类:加载登录页面,并回调post_login登录提交数据
    def start_requests(self):
        return [scrapy.Request(
            url=self.LoginUrl,
            meta={'cookiejar': 1},
            callback=self.post_login)]
    #执行提交所要登录的数据信息,
    def post_login(self,response):
        #验证登录
        return [scrapy.FormRequest.from_response(response,
                                                 url=self.LoginCheckUrl,
                                                 meta={'cookiejar': response.meta['cookiejar']},
                                                 formdata=self.formdata,
                                                 callback=self.after_login,
                                                 method="POST"
                                                 )]
    #登录成功后调用所要爬取的网址,start_urls中的网址逐一爬取
    def after_login(self,response):
        for u in self.start_urls:
            yield  scrapy.Request(url=u,
                           meta={'cookiejar': response.meta['cookiejar']},
                           callback=self.parse_details
                           )

    #爬取对应的页面信息,单页信息
    def parse_details(self,response):
        #选择当前页面的所有信息
        sel=Selector(response)
        #解析出table中的所有tr
        trItems=sel.xpath('//table[@class="table fn-mt-20"]//tr')
        #解析tr中的所有数据
        for tr in trItems:
            self.PageIndex = self.PageIndex + 1
            print "===No." + str(self.PageIndex)+"=="
            tdItems = tr.xpath('//td/text()')
            print tdItems[0].extract().strip()
            print tdItems[1].extract().strip()
            print tdItems[2].extract().strip()
            print tdItems[3].extract().strip()
            print tdItems[4].extract().strip()
            print tdItems[5].extract().strip()
            print tdItems[6].extract().strip()
            print tdItems[7].extract().strip()
            print tdItems[8].extract().strip()
        pass

文章来源于:
http://blog.csdn.net/u013533810/article/details/54866466
http://blog.csdn.net/q_an1314/article/details/51038114

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值