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

附上原创链接:

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. 一张图看懂git push

    基本用法 上面的四条命令在工作目录.暂存目录(也叫做索引)和仓库之间复制文件. git add files 把当前文件放入暂存区域. git commit 给暂存区域生成快照并提交. git rese ...

  2. TCP 三次握手四次挥手, ack 报文的大小.tcp和udp的不同之处、tcp如何保证可靠的、tcp滑动窗口解释

    一.TCP三次握手和四次挥手,ACK报文的大小 首先连接需要三次握手,释放连接需要四次挥手 然后看一下连接的具体请求: [注意]中断连接端可以是Client端,也可以是Server端. [注意] 在T ...

  3. SVN合并代码

    分之合并主干代码, 修改冲突后提交, 更新本地代码, 主干合并分之,

  4. Python 面向对象 基础

    编程范式概述:面向过程 和 面向对象 以及函数式编程 面向过程:(Procedure Oriented)是一种以事件为中心的编程思想. 就是分析出解决问题所需要的步骤,然后用函数把这些步骤一步一步实现 ...

  5. PHPstorm的数据库功能

    PHPstorm真是神器,居然有表.视图.存储过程的功能,非常人性化,建表那叫一个舒服,而且sql语句可以像其他代码一样显示"区域",结构更加清晰.

  6. myeclipse给项目改了名字,但部署tomcat的项目名还是原来的

    如标题所示: 在myeclipse中按F2改了项目名称,之前在tomcat中部署的名称是另一个,再次重新部署,永远是上一个的旧名称 解决办法: 项目点右键-properties-左上角搜索框输入web ...

  7. 回归树|GBDT|Gradient Boosting|Gradient Boosting Classifier

    已经好久没写了,正好最近需要做分享所以上来写两篇,这篇是关于决策树的,下一篇是填之前SVM的坑的. 参考文献: http://stats.stackexchange.com/questions/545 ...

  8. ngInclude与script加载模板

    ng-include: 官网实例: <p>ng-include:</p> <select ng-model="template" ng-options ...

  9. Python脚本报错AttributeError: ‘module’ object has no attribute’xxx’解决方法

    最近在编写Python脚本过程中遇到一个问题比较奇怪:Python脚本完全正常没问题,但执行总报错"AttributeError: 'module' object has no attrib ...

  10. struts文件上传,获取文件名和文件类型

    struts文件上传,获取文件名和文件类型   Action中还有两个属 性:uploadFileName和uploadContentType,这两个属性分别用于封装上传文件的文件名.文件类型.这是S ...