本文是跟着大神博客,尝试从网站上爬一堆东西,一堆你懂得的东西

附上原创链接:

http://www.cnblogs.com/qiyeboy/p/5428240.html

基本思路是,查看网页元素,填写xpath表达式,获取信息。自动爬取策略是,找到翻页网页元素,获取新链接地址,执行翻页。网页分析部分不再赘述,原博讲的很好很清楚,很涨姿势

基于拿来主义,我们只需要知道怎么更改Scrapy框架就行了~

items.py:

import scrapy

class TestprojItem(scrapy.Item):
image_urls = scrapy.Field();

由于仅关注图片信息,所以这里item只定义了一个元素。

spider.py:

class FirstSpider(scrapy.Spider):
name = "jiandan"
allowed_domains = ["http://jiandan.net/ooxx"]
new_url = None
start_urls = [
"http://jiandan.net/ooxx"
] def parse(self, response):
item = TestprojItem()
item['image_urls'] = response.xpath('//img//@src').extract()
#print "extracting..." + ''.join(item['image_urls'])
yield item
self.new_url = response.xpath('//a[@class="previous-comment-page"]//@href').extract_first()
print 'new_url:\t' + self.new_url if self.new_url:
self.start_urls.append(self.new_url)
yield scrapy.Request(self.new_url, callback=self.parse, dont_filter=True)

回顾并强调一下本次任务的目标:简单上的妹子图片!

上面是我自己修改的代码,可能allowed_domains字段设置有问题,每次重新爬取的时候会被认为是非法,所以在代码最后一行加了个 dont_filter=True.

parse: 对爬取页面进行解析。其中,new_url是获取翻页请求地址,然后在最后一行scrapy.Request重新请求。

pipelines.py:

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

# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html import os
import urllib from testProj import settings class TestprojPipeline(object): def process_item(self, item, spider):
dir_path = '%s%s' % (settings.IMAGES_STORE, spider.name)
print 'dir_path:', dir_path
if not os.path.exists(dir_path):
os.makedirs(dir_path)
for image_url in item['image_urls']:
list_name = image_url.split('/')
file_name = list_name[len(list_name)-1] file_path = '%s%s'%(dir_path, file_name)
if os.path.exists(file_name):
continue
with open(file_path, 'wb') as fw:
conn = urllib.urlopen(image_url)
fw.write(conn.read())
fw.close() return item

对爬取的元素进行处理。本文直接放到某个本地文件夹中,所以最后有文件读写。

其中settings.IMAGES_STORE需要进入settings进行设置。另外,settings中的 ITEM_PIPLINES字段取消掉注释。

OK,基本完成。切入cmd, scrapy crawl jiandan  瞬间完成,进入文件夹,什么也没有啊?查看cmd输出信息

重定位到一个奇怪的url, 打开来看

我是小白,原来这就是被网站ban了。很多网站有反爬虫设置。如何突破?基本策略有以下几点:

好几条看不懂。我自己研究。浏览器再次打开简单网,能打开。说明需要伪装成浏览器想服务器发送请求。

工程下新建 middlewares.py文件,代码如下:

import random

class RandomUserAgent(object):

    def __init__(self, agents):
self.agents = agents @classmethod
def from_crawler(cls, crawler):
print 'in from crawler'
return cls(crawler.settings.getlist('USER_AGENTS')) def process_request(self, request, spider):
print 'in process request'
request.headers.setdefault('User-Agent', random.choice(self.agents))

settings.py中做相应修改:

USER_AGENTS = [
"Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; AcooBrowser; .NET CLR 1.1.4322; .NET CLR 2.0.50727)",
"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0; Acoo Browser; SLCC1; .NET CLR 2.0.50727; Media Center PC 5.0; .NET CLR 3.0.04506)",
#中间还有很多,这里省略了
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.11 (KHTML, like Gecko) Chrome/23.0.1271.64 Safari/537.11",
"Mozilla/5.0 (X11; U; Linux x86_64; zh-CN; rv:1.9.2.10) Gecko/20100922 Ubuntu/10.10 (maverick) Firefox/3.6.10"
]
COOKIES_ENABLED = False
DOWNLOADER_MIDDLEWARES = {
'scrapy.contrib.downloadermiddleware.useragent.UserAgentMiddleware' : None,
'testProj.middlewares.RandomUserAgent': 100
}

这里 DOWNLOADER_MIDDLEWARES 字段的修改很重要,它相当于是定位到之前写的middlewares.py文件。注意一下,我是吧middlewares.py文件放在testProj项目根目录下,和items.py之类在一起,才这样写,如果其他目录,可能需要改变名称。(但是我放在testProj/middlewares/middlewares.py,setting里面写 testProj.middlewares.middlewares.RandomUserAgent依旧没用,不知道为什么,调了很久)

OK。大致完成

但是我发现下载了大概2000张图片之后又下不动了,整个Scrapy就卡在那儿,也不输出日志,不清楚什么原因,可能是需要加入ip代理,下次再来研究吧。

Python爬虫Scrapy框架入门(2)的更多相关文章

  1. Python爬虫Scrapy框架入门(0)

    想学习爬虫,又想了解python语言,有个python高手推荐我看看scrapy. scrapy是一个python爬虫框架,据说很灵活,网上介绍该框架的信息很多,此处不再赘述.专心记录我自己遇到的问题 ...

  2. Python爬虫Scrapy框架入门(1)

    也许是很少接触python的原因,我觉得是Scrapy框架和以往Java框架很不一样:它真的是个框架. 从表层来看,与Java框架引入jar包.配置xml或.property文件不同,Scrapy的模 ...

  3. Python爬虫Scrapy框架入门(3)

    往往需要爬取的网页是呈一个树状结构.比如,需要先爬取一个目录,然后再在目录中选择具体的爬取目标.而目录和具体目标之间,网页结构不同,使得我们不能使用相同的爬取策略. 从之前的经验来看,我们对scrap ...

  4. python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)

    操作环境:python3 在上一文中python爬虫scrapy框架--人工识别知乎登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前 ...

  5. python爬虫scrapy框架

    Scrapy 框架 关注公众号"轻松学编程"了解更多. 一.简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量 ...

  6. Python爬虫 ---scrapy框架初探及实战

    目录 Scrapy框架安装 操作环境介绍 安装scrapy框架(linux系统下) 检测安装是否成功 Scrapy框架爬取原理 Scrapy框架的主体结构分为五个部分: 它还有两个可以自定义下载功能的 ...

  7. Python爬虫-- Scrapy框架

    Scrapy框架 Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是事件驱动的,并且比较适合异步的代码.对于会阻塞线程的操作包含访问文件.数据库或者Web.产生新的进程并需要 ...

  8. Python爬虫-Scrapy框架的工作原理

    Scrapy框架工作原理 Scrapy框架架构图 Scrapy框架主要由六大组件组成,分别为: ​ 调度器(Scheduler),下载器(Downler),爬虫(Spiders),中间件(Middwa ...

  9. python爬虫----scrapy框架简介和基础应用

    Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...

随机推荐

  1. php面向对象编程(二)

    现在我们来了解一下面向对象的一个封装性的问题 封装性:在我的理解里面 可以理解为一个u盘 我们使用u盘的接口与电脑进行数据之间的交互 但是我们不能看到里面的结构 这个特性我们可以称为封装性 好处:利用 ...

  2. 【BZOJ 3051】【UOJ #57】【WC 2013】平面图

    http://www.lydsy.com/JudgeOnline/problem.php?id=3051 http://uoj.ac/problem/57 这道题需要平面图转对偶图,点定位,最小生成树 ...

  3. Android进程保活

    Android进程回收机制 Low Memory Killer原理 微信团队原创分享:Android版微信后台保活实战分享(网络保活篇) 微信团队原创分享:Android版微信后台保活实战分享(进程保 ...

  4. 【USACO 2.4】Cow Tours (最短路)

    题意:给你n(最多150)个点的坐标,给出邻接矩阵,并且整个图至少两个联通块,现在让你连接一条边,使得所有可联通的两点的最短距离的最大值最小. 题解:先dfs染色,再用floyd跑出原图的直径O($n ...

  5. 8.Android 系统状态栏沉浸式/透明化解决方案

    转载:http://www.jianshu.com/p/34a8b40b9308 前言 网上已经有很多有关于系统状态栏的解决方案,这篇文章也不会有什么新奇的解决方案,都是本人经过自己试验,统计提炼出来 ...

  6. js-JavaScript高级程序设计学习笔记19

    第22章 高级技巧 1.高级函数 1.安全的类型检测. typeof,instanceof并非完全可靠. 安全的类型检测:使用Object原生的toString()方法. function isArr ...

  7. Python的MySQLdb模块安装

    MySQL-python-1.2.1.tar.gz  下载地址:https://pan.baidu.com/s/1kVfH84v 然后解压,打开README(这个其实没有什么鸟用) 里面有安装过程: ...

  8. 分析移动端APP的网络请求抓包

    为了方便,本文以 iOS 系统来进行演示. 使用代理 移动操作系统中都有可以设定系统代理的设置,比如在 iOS 中可以通过 Settings->WLAN 看到很多 Networks,通过点击它们 ...

  9. css3 input边框蓝光特效

    1.style样式 <style type="text/css"> .demok3_input { transition: all 0.30s ease-in-out; ...

  10. zTree 循环树

    /// <summary> /// 初始化第一次节点加载 /// </summary> /// protected string _menu = string.Empty; p ...