# -*- 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("--------------------------")