Scrapy登錄爬取豆瓣個人中心頁

# -*- coding: utf-8 -*-
import urllib

import scrapy
from os import path
from scrapy import Request, FormRequest
import os

#登錄爬取豆瓣
d = path.dirname(__file__) if "__file__" in locals() else os.getcwd()
class LoginspdSpider(scrapy.Spider):
    name = 'loginspd'
    allowed_domains = ['douban.com']
    #設置頭信息,模擬瀏覽器爬取
    header = {"User-Agent":"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.122 Safiri/537.36 SE 2.X MetaSr 1.0"}
    #編寫start_requests() 方法,第一次會默認調取該方法中的請求
    def start_requests(self):
        # 首先爬一次登錄頁,然後進入回調函數parse()
        return [Request("https://accounts.douban.com/login", meta={"cookiejar": 1}, callback=self.parse)]

    def parse(self, response):
        # 獲取驗證碼圖片所在地址,獲取後賦給captcha 變量,此時captcha 爲一個列表
        captcha = response.xpath('//img[@id="captcha_image"]/@src').extract()
        #因爲登錄時有時網頁有驗證碼, 有時沒有驗證碼
        #所以需要判斷此時是否需要輸入驗證碼,若captcha 中有元素,說明有驗證碼信息
        if len(captcha)>0:
            print("此時有驗證碼")
            #設置將驗證碼圖片存儲到本地地址
            localpath=path.join(d,'captcha.png')
            #將服務器中的驗證碼圖片存到本地,供我們在本地直接進行查看
            urllib.request.urlretrieve(captcha[0], filename=localpath)
            print("請查看本地圖片captcha.png,並輸入對應驗證碼:")
            captcha_value = input()
            #設置要傳遞的post信息
            data={
                #設置登錄帳號,格式爲帳號字段名:具體帳號
                "form_email":"xxxxxxxxxx",
                "form_password":" ",
                "captcha_solution":captcha_value,
                #設置需要轉向的網址,由於我們要爬取個人中心頁,所以轉向個人中心頁
                "redir": ""
            }
        #否則說明captcha 列表中沒有元素,即此時不需要輸入驗證碼信息
        else:
            print("此時沒有驗證碼")
            # 設置要傳遞的post信息,此時沒有驗證碼字段
            data={
                "form_email": "xxxxxxxxxx",
                "form_password": " ",
                # 設置需要轉向的網址,由於我們要爬取個人中心頁,所以轉向個人中心頁
                "redir": " "
            }
        print("登錄中...")
        #通過
        return [FormRequest.from_response(response, meta={"cookiejar": response.meta["cookiejar"]}, headers=self.header, formdata=data, callback=self.next)]
    def next(self,response):
        print("此時已經登錄完成並爬取了個人中心中該用戶的相關信息")
        xtitle = "/html/head/title/text()"
        xnotetitle = "//div[@class = 'note-header p12']/a/@title"
        xnotetime = "//div[@class = 'note-header p12']//span[@class='p1']/text()"
        xnotecontent = "//div[@class = 'mbtr2']/div[@class = 'note']/text()"
        xnoteurl = "//div[@class = 'note-header p12']/a/@href"

        title = response.xpath(xtitle).extract()
        notetitle = response.xpath(xnotetitle).extract()
        notetime = response.xpath(xnotetime).extract()
        notecontent = response.xpath(xnotecontent).extract()
        noteurl = response.xpath(xnoteurl).extract()

        print('網頁的標題是:'+title[0])
        for i in range(len(notetitle)):
            print("第"+str(i+1)+"篇文章的信息如下:")
            print("文章標題爲:"+notetitle[i])
            print("文章發表時間爲:"+notetime[i])
            print("文章內容爲:"+notecontent[i])
            print("文章鏈接爲:"+noteurl[i])
            print("--------------------------")

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章