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