Python爬虫Scrapy框架入门(2)
本文是跟着大神博客,尝试从网站上爬一堆东西,一堆你懂得的东西
附上原创链接:
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了。很多网站有反爬虫设置。如何突破?基本策略有以下几点:
- 动态设置user agent
- 禁用cookies
- 设置延迟下载
- 使用 Google cache
- 使用IP地址池( Tor project 、VPN和代理IP)
- 使用 Crawlera
好几条看不懂。我自己研究。浏览器再次打开简单网,能打开。说明需要伪装成浏览器想服务器发送请求。
工程下新建 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)的更多相关文章
- Python爬虫Scrapy框架入门(0)
想学习爬虫,又想了解python语言,有个python高手推荐我看看scrapy. scrapy是一个python爬虫框架,据说很灵活,网上介绍该框架的信息很多,此处不再赘述.专心记录我自己遇到的问题 ...
- Python爬虫Scrapy框架入门(1)
也许是很少接触python的原因,我觉得是Scrapy框架和以往Java框架很不一样:它真的是个框架. 从表层来看,与Java框架引入jar包.配置xml或.property文件不同,Scrapy的模 ...
- Python爬虫Scrapy框架入门(3)
往往需要爬取的网页是呈一个树状结构.比如,需要先爬取一个目录,然后再在目录中选择具体的爬取目标.而目录和具体目标之间,网页结构不同,使得我们不能使用相同的爬取策略. 从之前的经验来看,我们对scrap ...
- python爬虫scrapy框架——人工识别登录知乎倒立文字验证码和数字英文验证码(2)
操作环境:python3 在上一文中python爬虫scrapy框架--人工识别知乎登录知乎倒立文字验证码和数字英文验证码(1)我们已经介绍了用Requests库来登录知乎,本文如果看不懂可以先看之前 ...
- python爬虫scrapy框架
Scrapy 框架 关注公众号"轻松学编程"了解更多. 一.简介 Scrapy是用纯Python实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用途非常广泛. 框架的力量 ...
- Python爬虫 ---scrapy框架初探及实战
目录 Scrapy框架安装 操作环境介绍 安装scrapy框架(linux系统下) 检测安装是否成功 Scrapy框架爬取原理 Scrapy框架的主体结构分为五个部分: 它还有两个可以自定义下载功能的 ...
- Python爬虫-- Scrapy框架
Scrapy框架 Scrapy使用了Twisted作为框架,Twisted有些特殊的地方是它是事件驱动的,并且比较适合异步的代码.对于会阻塞线程的操作包含访问文件.数据库或者Web.产生新的进程并需要 ...
- Python爬虫-Scrapy框架的工作原理
Scrapy框架工作原理 Scrapy框架架构图 Scrapy框架主要由六大组件组成,分别为: 调度器(Scheduler),下载器(Downler),爬虫(Spiders),中间件(Middwa ...
- python爬虫----scrapy框架简介和基础应用
Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架. 其可以应用在数据挖掘,信息处理或存储历史数据等一系列的程序中.其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以 ...
随机推荐
- [转]Ext ComboBox 默认选中某一项
原文地址:http://blog.csdn.net/liuguxing/article/details/8623190 项目中经常用到选择框,需要从后台异步加载数据,可单独写一个组件进行加载 App. ...
- 由Memcached升级到 Couchbase的 Java 客户端的过程记录(三)
采用之前的源码运行后,我们发现 只有一个配置信息 即servers=127.0.0.1:11211,即 Couchbase Server的服务所在ip 和端口,此时数据直接存在 default 中 根 ...
- JavaScript零基础学习系列四
案例分享 对象 具体的东西,在以js的眼光看所有的标签都是标签对象,对象是属性的无序集合. 创建对象有两种方式: 直接量: 构造器:所谓的构造器,其实就是函数,只不过这个函数有些特殊,因为它是用于创建 ...
- JAVA_jdk下载和环境变量的配置
Java是一种计算机编程语言,拥有跨平台.面向对象.泛型编程的特性,广泛应用于企业级Web应用开发和移动应用开发. 基本组成: Java由四方面组成:Java编程语言.Java类文件格式.Java虚拟 ...
- 源码升级安装python
1.下载 python: https://www.python.org/downloads/release/python-2712/ 2.编译安装 sudo mkdir /usr/local/pyth ...
- 修改Firefox的User-Agent,伪装修改秘籍
火狐浏览器修改userAgent的办法一: 在火狐浏览器地址栏输入"about:config",按下回车进入设置菜单. 找到"general.useragent.over ...
- ppt2013技术整理
1. 显示选择窗格 便于选择该页的所有元素.分组.隐藏与显示等. 位于:开始-编辑-选择-选择窗格 2. 显示动画窗格 便于调节页面中元素的动画状态. 位于:动画-高级动画-动画窗格 3. 绑定动画触 ...
- mate-desktop安装在其他目录时一些配置信息
1.mate-desktop安装在其他目录时一些配置信息 2.BIN目录下添加相应的mate-session_gtk2/3 3.首先配置如下环境变量 #!/bin/sh if [[ "${E ...
- python:mysql+pycharm+Django环境搭建
1.安装mysql-python 环境:OS X Yosemite10.10.2 + Python2.7 首先网上搜了下mysql-python,说要先安装mysql客户端,然后改配置文件,可是各种改 ...
- Digital calculation
No1=1 No2=2 1. let result=No1+No2 let No1++ let No1+=3 2. result=$[No1+No2] 3. result=$((No1+No ...