1. 程式人生 > >Scrapy模擬登入抓資料基本應用

Scrapy模擬登入抓資料基本應用

# 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