设为首页 加入收藏

TOP

爬虫学习之基于Scrapy的爬虫自动登录(二)
2017-09-30 16:54:57 】 浏览:4752
Tags:爬虫 习之 基于 Scrapy 自动 登录
py.Field() # 豆邮标题

定义doumailspider

# -*- coding:utf-8 -*-
'''by sudo rm -rf  http://imchenkun.com'''
import scrapy
from faker import Factory
from douban.items import DoubanMailItem
import urlparse

f = Factory.create()


class MailSpider(scrapy.Spider):
    name = 'douban-mail'
    allowed_domains = ['accounts.douban.com', 'douban.com']
    start_urls = [
        'https://www.douban.com/'
    ]
    headers = {
        'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
        'Accept-Encoding': 'gzip, deflate, br',
        'Accept-Language': 'zh-CN,zh;q=0.8,en-US;q=0.5,en;q=0.3',
        'Connection': 'keep-alive',
        'Host': 'accounts.douban.com',
        'User-Agent': f.user_agent()
    }

    formdata = {
        'form_email': '您的账号',
        'form_password': '您的密码',
        # 'captcha-solution': '',
        # 'captcha-id': '',
        'login': '登录',
        'redir': 'https://www.douban.com/',
        'source': 'None'
    }

    def start_requests(self):
        return [scrapy.Request(url='https://www.douban.com/accounts/login',
                               headers=self.headers,
                               meta={'cookiejar': 1},
                               callback=self.parse_login)]

    def parse_login(self, response):
        # 如果有验证码要人为处理
        if 'captcha_image' in response.body:
            print 'Copy the link:'
            link = response.xpath('//img[@class="captcha_image"]/@src').extract()[0]
            print link
            captcha_solution = raw_input('captcha-solution:')
            captcha_id = urlparse.parse_qs(urlparse.urlparse(link).query, True)['id']
            self.formdata['captcha-solution'] = captcha_solution
            self.formdata['captcha-id'] = captcha_id
        return [scrapy.FormRequest.from_response(response,
                                                 formdata=self.formdata,
                                                 headers=self.headers,
                                                 meta={'cookiejar': response.meta['cookiejar']},
                                                 callback=self.after_login
                                                 )]

    def after_login(self, response):
        print response.status
        self.headers['Host'] = "www.douban.com"
        return scrapy.Request(url='https://www.douban.com/doumail/',
                              meta={'cookiejar': response.meta['cookiejar']},
                              headers=self.headers,
                              callback=self.parse_mail)

    def parse_mail(self, response):
        print response.status
        for item in response.xpath('//div[@class="doumail-list"]/ul/li'):
            mail = DoubanMailItem()
            mail['sender_time'] = item.xpath('div[2]/div/span[1]/text()').extract()[0]
            mail['sender_from'] = item.xpath('div[2]/div/span[2]/text()').extract()[0]
            mail['url'] = item.xpath('div[2]/p/a/@href').extract()[0]
            mail['title'] = item.xpath('div[2]/p/a/text()').extract()[0]
            print mail
            yield mail

这里需要注意的有三个地方:

  1. 第一个是meta中的cookiejar

    Scrapy通过使用 cookiejar
    Request meta key来支持单spider追踪多cookie session。默认情况下其使用一个cookie jar(session),不过您可以传递一个标示符来使用多个。

  2. start_requests 我们这里重写了爬虫爬取得第一个页面,这里一开始就进去到登录页面
  3. 当执行爬虫的时候,我们需要把打印出来的验证码地址粘贴到浏览器中,手动输入到控制上完成验证。

同目标一一样需要设置settings中的相关参数,唯一不同的是ITEM_PIPELINES。

最后我们使用以下命令来启动爬虫

scrapy crawl douban-mail -o douban_mail_page1.csv

csv文件截图如下:
豆邮数据

Github地址:https://github.com/imchenkun/ick-spider/tree/master/douban

###总结

本篇我们学习了如果定义Item以及如何对Item进行进一步处理(Item Pipeline), 还通过登录豆瓣的案例来了解了如果使用Scrapy进行表单提交和Cookie追踪,也了解了对于有验证码的情况该如何处理,当然我们这里暂时还不讨论如何识别验证码。关于Scrapy的更高级的一些用法和特性可以进一步阅读Scrapy官网的文档。

特别申明:本文所提到的豆瓣网只是拿来进行爬虫的技术交流学习,读者涉及到的所有侵权问题都与本人无关,也希望大家在学习实战的过程中不要大量的爬取内容对服务器造成负担

本文首发在sudo rm -rf 采用署名(BY)-非商业性使用(NC)-禁止演绎(ND) 转载请注明原作者

--EOF--

首页 上一页 1 2 下一页 尾页 2/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇py-day1简单使用方法及语法使用详.. 下一篇python魔法方法-属性访问控制

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目