本节内容

在访问网站的时候,我们经常遇到有些页面必须用户登录才能访问。这个时候我们之前写的傻傻的爬虫就被ban在门外了。所以本节,我们给爬虫配置cookie,使得爬虫能保持用户已登录的状态,达到获得那些需登录才能访问的页面的目的。

由于本节只是单纯的想保持一下登陆状态,所以就不写复杂的获取页面了,还是像本教程的第一部分一样,下载个网站主页验证一下就ok了。本节github戳此处

原理

一般情况下,网站通过存放在客户端的一个被称作cookie的小文件来存放用户的登陆信息。在浏览器访问网站的时候,会把这个小文件发往服务器,然后服务器根据这个小文件确定你的身份,然后返回给你特定的信息。

我们要做的就是尽量模拟浏览器的行为,在使用爬虫访问网站时也带上cookie来访问。

前提

前提当然是你有个账号了,目前本教程一直使用的论坛心韵论坛是我本人搭建的,已经被各种爬虫发的广告水的不要不要的了,为了本教程,仍然是开放注册并一直开着服。但不保证会一直开着,不过根据本教程的讲解,爬取别的Discuz框架论坛一般是没问题的。扯远了……

获取cookie

按照以下步骤操作

  1. 登陆论坛,进入主页
  2. 按F12进入Chrome或Firefox的开发者调试工具,选择Network选项卡
  3. 按F5刷新一下页面
  4. 选择Doc子选项卡
  5. 找到主页的请求和返回情况
  6. 找到Request Headers
  7. 复制出cookie

如图:

把cookie转化格式

在scrapy中,设置cookie需要是字典格式的,可是我们从浏览器Copy出来的是字符串格式的,所以我们需要写个小程序来转化一下

transCookie.py

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

class transCookie:
def __init__(self, cookie):
self.cookie = cookie def stringToDict(self):
'''
将从浏览器上Copy来的cookie字符串转化为Scrapy能使用的Dict
:return:
'''
itemDict = {}
items = self.cookie.split(';')
for item in items:
key = item.split('=')[0].replace(' ', '')
value = item.split('=')[1]
itemDict[key] = value
return itemDict if __name__ == "__main__":
cookie = "你复制出的cookie"
trans = transCookie(cookie)
print trans.stringToDict()

运行的效果如图

然后把这个字典复制出来。

给scrapy配置cookie

首先把刚才得到的cookie放到settings.py

settings.py

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

BOT_NAME = 'heartsong'

SPIDER_MODULES = ['heartsong.spiders']
NEWSPIDER_MODULE = 'heartsong.spiders' ROBOTSTXT_OBEY = False # 不遵守Robot协议 # 使用transCookie.py翻译出的Cookie字典
COOKIE = {'key1': 'value1', 'key2': 'value2'}

然后编写爬虫文件

heartsong_spider.py

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

# import scrapy # 可以用这句代替下面三句,但不推荐
from scrapy.spiders import Spider
from scrapy import Request
from scrapy.conf import settings class HeartsongSpider(Spider):
name = "heartsong"
allowed_domains = ["heartsong.top"] # 允许爬取的域名,非此域名的网页不会爬取
start_urls = [
# 主页,此例只下载主页,看是否有登录信息
"http://www.heartsong.top/forum.php"
] cookie = settings['COOKIE'] # 带着Cookie向网页发请求 # 发送给服务器的http头信息,有的网站需要伪装出浏览器头进行爬取,有的则不需要
headers = {
'Connection': 'keep - alive', # 保持链接状态
'User-Agent': 'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.82 Safari/537.36'
} # 对请求的返回进行处理的配置
meta = {
'dont_redirect': True, # 禁止网页重定向
'handle_httpstatus_list': [301, 302] # 对哪些异常返回进行处理
} # 爬虫的起点
def start_requests(self):
# 带着cookie向网站服务器发请求,表明我们是一个已登录的用户
yield Request(self.start_urls[0], callback=self.parse, cookies=self.cookie,
headers=self.headers, meta=self.meta) # Request请求的默认回调函数
def parse(self, response):
with open("check.html", "wb") as f:
f.write(response.body) # 把下载的网页存入文件

总的来说一句话,就是带着cookie发起Request请求。

运行之后会将主页保存,我们打开文件查看一下效果

小结

本节介绍了cookie的获取方法和如何给scrapy设置cookie,下节我会介绍如果带着登陆状态去回复主题帖。

scrapy爬取某网站,模拟登陆过程中遇到的那些坑的更多相关文章

  1. 使用webdriver+urllib爬取网页数据(模拟登陆,过验证码)

    urilib是python的标准库,当我们使用Python爬取网页数据时,往往用的是urllib模块,通过调用urllib模块的urlopen(url)方法返回网页对象,并使用read()方法获得ur ...

  2. Python 爬取 "王者荣耀.英雄壁纸" 过程中的矛和盾

    1. 前言 学习爬虫,最好的方式就是自己编写爬虫程序. 爬取目标网站上的数据,理论上讲是简单的,无非就是分析页面中的资源链接.然后下载.最后保存. 但是在实施过程却会遇到一些阻碍. 很多网站为了阻止爬 ...

  3. 1.scrapy爬取的数据保存到es中

    先建立es的mapping,也就是建立在es中建立一个空的Index,代码如下:执行后就会在es建lagou 这个index.     from datetime import datetime fr ...

  4. 使用Scrapy爬取图书网站信息

    重难点:使用scrapy获取的数值是unicode类型,保存到json文件时需要特别注意处理一下,具体请参考链接:https://www.cnblogs.com/sanduzxcvbnm/p/1030 ...

  5. Scrapy 爬取某网站图片

    1. 创建一个 Scrapy 项目,在命令行或者 Pycharm 的 Terminal 中输入: scrapy startproject imagepix 自动生成了下列文件: 2. 在 imagep ...

  6. scrapy爬取招聘网站,items转换成dict遇到的问题

    pipelines代码 1 import json 2 3 class TencentJsonPipeline(object): 4 def __init__(self): 5 self.file = ...

  7. scrapy爬取美女图片

    使用scrapy爬取整个网站的图片数据.并且使用 CrawlerProcess 启动. 1 # -*- coding: utf-8 -* 2 import scrapy 3 import reques ...

  8. Python网络爬虫 | Scrapy爬取妹子图网站全站照片

    根据现有的知识,写了一个下载妹子图(meizitu.com)Scrapy脚本,把全站两万多张照片下载到了本地. 网站的分析 网页的网址分析 打开网站,发现网页的网址都是以 http://www.mei ...

  9. scrapy爬取西刺网站ip

    # scrapy爬取西刺网站ip # -*- coding: utf-8 -*- import scrapy from xici.items import XiciItem class Xicispi ...

随机推荐

  1. ASIHTTPRequest 详解, http 请求终结者

    转:http://www.cnblogs.com/chen1987lei/archive/2011/06/07/2074636.html ASIHTTPRequest是一款极其强劲的HTTP访问开源项 ...

  2. 删除weblogic应用缓存,weblogic 缓存的删除方法

    security (注意:security目录下为安全认证文件,切不可删除!) 正常情况下只需删除tmp目录下缓存文件(不同的工程在tmp下面有不同的路径,如果不清楚的话可以一起删除). 个别情况下会 ...

  3. hdu 1828 Picture(线段树扫描线矩形周长并)

    线段树扫描线矩形周长并 #include <iostream> #include <cstdio> #include <algorithm> #include &l ...

  4. (98)Address already in use: make_sock: could not bind to address 80 [resolved] (2012-10-11 09:04)

    以前遇到一个问题: sudo /etc/init.d/apache2 start * Starting web server apache2 apache2: Could not reliably d ...

  5. Memcache及telnent命令具体解释

    1.启动Memcache 经常使用參数 memcached 1.4.3 -p <num>      设置port号(默认不设置为: 11211) -U <num>      U ...

  6. WCF系列(六) - WCF安全系列(一) - basicHttpBinding

    绑定可指定在与终结点通话时所使用的通信机制,并指示如何连接到终结点.绑定由一些元素组成,这些元素指定如何对 Windows Communication Foundation (WCF) 通道进行分层以 ...

  7. 检查死锁与Locked ownable synchronizers(转载)

    通过jstack可快速检查线程的死锁信息,用法如下: # 获取JVM ID(JAVA 进程ID),通过参数lv可以获取更详细的JAVA方法调用信息 jps -lv # 得到JVM ID后,执行jsta ...

  8. golang ----gc问题

    go程序内存占用大的问题 这个问题在我们对后台服务进行压力测试时发现,我们模拟大量的用户请求访问后台服务,这时各服务模块能观察到明显的内存占用上升.但是当停止压测时,内存占用并未发生明显的下降.花了很 ...

  9. VisualStudio2013下安装Python Flask/jade

    为什么是Python? 不做程序的工作好久了,当创业成为工作后越发发现时间的宝贵.时间那么少,需求确实多样的,软件的,web的,还得跨平台,以前熟悉的.Net明显每一项满足的.选来选去还是Python ...

  10. Socket网络编程--聊天程序(8)

    上一节已经完成了对用户的身份验证了,既然有了验证,那么接下来就能对不同的客户端进行区分了,所以这一节讲实现私聊功能.就是通过服务器对客户端的数据进行转发到特定的用户上, 实现私聊功能的聊天程序 实现的 ...