python自动化爬虫框架_Python爬虫框架Scrapy的爬虫自动登录

关注Python学习交流

学习更多Python知识

起步

首先我们使用Scrapy的命令行创建一个新的项目

'''

想要学习Python?Python学习交流群:984632579满足你的需求,资料都已经上传群文件,可以自行下载!

'''

scrapy startproject douban

运行后,我们就有了下面这样的目录结构

+ douban # 根目录

|- douban # Python的项目目录

|- spiders # 爬虫Spider部分,用于提取网页内容

|- __init__.py

|- __init_ _.py

|- items.py # 爬虫item, 用于定义数据结构

|- pipelines.py # 爬虫pipeline,用于处理提取的结构,比如清洗数据、去重等

|- settings.py # Scrapy框架参数项目参数设置

|- scrapy.cfg # 爬虫部署相关设置

Scrapy为我们生成了已经组织好的目录结构,上面的注释部分解释了每个文件及目录的作用。

建立目标

本篇我们来建立两个目标,这两个目标都是基于豆瓣网:

目标一:抓取豆瓣TOP250的图书信息并保存成csv文件

目标二:抓取我的第一页豆邮标题(需要登录),并保存成csv文件

分析目标一

目标一是豆瓣的TOP250图书信息,首先我们进入到TOP250的列表(https://book.douban.com/top250),我用图示圈出我们这次要爬取的内容,具体请看图示:

从图上的框线中我们主要圈出了书名、价格、出版年份、出版社、评分,其中出版年份,出版社以及价格是在一行中,这个我们需要进一步处理。

分页的处理:总记录是250条,每页是25条图书信息,共分了10页。

实现目标一

需要用到的概念:

Item

Item Pipeline

首先建立Scrapy的Item, Scrapy的Item就是我们需要存储的数据结构,先修改items, 然后在spiders目录中新建一个名为bookspider.py的Python文件,由于我们需要在一堆字符串中提取出出版社和价格等信息所以我们这里需要对抓取的内容进一步处理, 在这之前还需要修改settings.py文件:

加入faker的模拟USER_AGENT数据防止被豆瓣屏蔽,

也可以设置DEFAULT_REQUEST_HEADERS参数。

修改ITEM_PIPELINES

代码如下所示:

items.py

# -*- coding: utf-8 -*-

'''by sudo rm -rf http://imchenkun.com'''

importscrapy

classDoubanBookItem(scrapy.Item):

name = scrapy.Field() # 书名

price = scrapy.Field() # 价格

edition_year = scrapy.Field() # 出版年份

publisher = scrapy.Field() # 出版社

ratings = scrapy.Field() # 评分

bookspider.py

importscrapy

fromdouban.items importDoubanBookItem

classBookSpider(scrapy.Spider):

name = 'douban-book'

allowed_domains = [ 'douban.com']

start_urls = [

'https://book.douban.com/top250'

]

defparse(self, response):

# 请求第一页

yieldscrapy.Request(response.url, callback=self.parse_next)

# 请求其它页

forpage inresponse.xpath( '//div[@class="paginator"]/a'):

link = page.xpath( '@href').extract()[ 0]

yieldscrapy.Request(link, callback=self.parse_next)

defparse_next(self, response):

foritem inresponse.xpath( '//tr[@class="item"]'):

book = DoubanBookItem()

book[ 'name'] = item.xpath( 'td[2]/div[1]/a/@title').extract()[ 0]

book[ 'price'] = item.xpath( 'td[2]/p/text()').extract()[ 0]

book[ 'ratings'] = item.xpath( 'td[2]/div[2]/span[2]/text()').extract()[ 0]

yieldbook

pipelines.py

classDoubanBookPipeline(object):

defprocess_item(self, item, spider):

info = item[ 'price'].split( ' / ') # [法] 圣埃克苏佩里 / 马振聘 / 人民文学出版社 / 2003-8 / 22.00元

item[ 'name'] = item[ 'name']

item[ 'price'] = info[ -1]

item[ 'edition_year'] = info[ -2]

item[ 'publisher'] = info[ -3]

returnitem

最后我们到douban的根目录中执行以下命令来运行爬虫来执行并导出数据到csv文件

scrapycrawldouban-book-odouban_book_top250.csv

csv文件截图如下:

分析目标二

目标二是建立在理解了目标一的基础上进行的,因为豆瓣登录次数过多会有验证码出现,这里提供一种手工填写验证码的方式,暂时不讨论如何去识别验证码,目标二的核心概念是如何提交POST表单和登录成功后带Cookie的请求。首先我们可以看到页面结构如下图所示:

实现目标二

定义Item

classDoubanMailItem(scrapy.Item):

sender_time = scrapy.Field() # 发送时间

sender_from = scrapy.Field() # 发送人

url = scrapy.Field() # 豆邮详细地址

title = scrapy.Field() # 豆邮标题

定义doumailspider

import scrapy

from faker import Factory

from douban.items import DoubanMailItem

import urlparse

f = Factory.create()

classMailSpider(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'

}

defstart_requests(self):

return[scrapy.Request(url= 'https://www.douban.com/accounts/login',

headers= self.headers,

meta={ 'cookiejar': 1},

callback= self.parse_login)]

defparse_login(self, response):

# 如果有验证码要人为处理

if'captcha_image'inresponse. 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

)]

defafter_login(self, response):

print response.status

self.headers[ 'Host'] = "www.douban.com"

returnscrapy.Request(url= 'https://www.douban.com/doumail/',

meta={ 'cookiejar': response.meta[ 'cookiejar']},

headers= self.headers,

callback= self.parse_mail)

defparse_mail(self, response):

print response.status

foritem inresponse.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

yieldmail

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

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

start_requests 我们这里重写了爬虫爬取得第一个页面,这里一开始就进去到登录页面

当执行爬虫的时候,我们需要把打印出来的验证码地址粘贴到浏览器中,手动输入到控制上完成验证。

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

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

scrapycrawldouban-mail-odouban_mail_page1.csv

csv文件截图如下:

总结

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

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值