taoo

  • 4

    获得赞
  • 2

    发布的文章
  • 0

    答辩的项目

Scrapy登录爬取豆瓣个人中心页

Python3

最后更新 2020-04-30 19:10 阅读 275

最后更新 2020-04-30 19:10

阅读 275

Python3

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

欢迎关注我的个人公众号“玩吧Coder”,感谢每一位关注支持我的朋友!

本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可,转载请附上原文出处链接和本声明。
本文链接地址:https://www.flyai.com/article/431
讨论
500字
表情
每日优质讨论奖励 20FAI
发送
每日优质讨论奖励 20FAI
删除确认
是否删除该条评论?
取消 删除