我的电脑显示陕西信合个人网银网银正在运行但没有登录窗口

下载数据挖掘、机器学习更多资料在文章底部Scrapy是一个为了爬取网站数据,提取结构性数据而编写的应用框架。 可以应用在包括数据挖掘,信息处理或存储历史数据等一系列的程序中。  其最初是为了页面抓取 (更确切来说, 网络抓取 )所设计的, 也可以应用在获取API所返回的数据(例如 Amazon Associates Web Services ) 或者通用的网络爬虫。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试。  Scrapy 使用了 Twisted异步网络库来处理网络通讯。整体架构大致如下:  Scrapy主要包括了以下组件:引擎:用来处理整个系统的数据流处理,触发事务。调度器:用来接受引擎发过来的请求,压入队列中,并在引擎再次请求的时候返回。下载器:用于下载网页内容,并将网页内容返回给蜘蛛。蜘蛛:蜘蛛是主要干活的,用它来制订特定域名或网页的解析规则。项目管道:负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。下载器中间件:位于Scrapy引擎和下载器之间的钩子框架,主要是处理Scrapy引擎与下载器之间的请求及响应。蜘蛛中间件:介于Scrapy引擎和蜘蛛之间的钩子框架,主要工作是处理蜘蛛的响应输入和请求输出。调度中间件:介于Scrapy引擎和调度之间的中间件,从Scrapy引擎发送到调度的请求和响应。  使用Scrapy可以很方便的完成网上数据的采集工作,它为我们完成了大量的工作,而不需要自己费大力气去开发。Scrapy Tutorial  在本文中,假定您已经安装好Scrapy。 如若不然,请参考 Installation guide。  接下来以爬取饮水思源BBS数据为例来讲述爬取过程,详见 bbsdmoz代码。  本篇教程中将带您完成下列任务:1. 创建一个Scrapy项目2. 定义提取的Item3. 编写爬取网站的 spider 并提取 Item4. 编写 Item Pipeline 来存储提取到的Item(即数据)  Scrapy由Python编写。如果您刚接触并且好奇这门语言的特性以及Scrapy的详情, 对于已经熟悉其他语言并且想快速学习Python的编程老手, 我们推荐 Learn Python The Hard Way , 对于想从Python开始学习的编程新手, 非程序员的Python学习资料列表 将是您的选择。Creating a project  在开始爬取之前,您必须创建一个新的Scrapy项目。进入您打算存储代码的目录中,运行下列命令:1scrapy startproject bbsdmoz  该命令将会创建包含下列内容的 bbsDmoz 目录:bbsDmoz/
scrapy.cfg
__init__.py
pipelines.py
settings.py
__init__.py
...  这些文件分别是:scrapy.cfg: 项目的配置文件bbsDmoz/: 该项目的python模块。之后您将在此加入代码。bbsDmoz/items.py: 项目中的item文件.bbsDmoz/pipelines.py: 项目中的pipelines文件.bbsDmoz/settings.py: 项目的设置文件.bbsDmoz/spiders/: 放置spider代码的目录.Defining our Item  Item 是保存爬取到的数据的容器;其使用方法和python字典类似,并且提供了额外保护机制来避免拼写错误导致的未定义字段错误。  类似在ORM中做的一样,您可以通过创建一个 scrapy.Item 类,并且定义类型为 scrapy.Field 的类属性来定义一个Item。(如果不了解ORM,不用担心,您会发现这个步骤非常简单)  首先根据需要从bbs网站获取到的数据对item进行建模。 我们需要从中获取url,发帖板块,发帖人,以及帖子的内容。 对此,在item中定义相应的字段。编辑 bbsDmoz 目录中的 items.py 文件:123456789101112from scrapy.item import Item, FieldclassBbsDmozItem(Item):url
= Field()forum = Field()poster = Field()content = Field()  一开始这看起来可能有点复杂,但是通过定义item, 您可以很方便的使用Scrapy的其他方法。而这些方法需要知道您的item的定义。Our first Spider  Spider是用户编写用于从单个网站(或者一些网站)爬取数据的类。  其包含了一个用于下载的初始URL,如何跟进网页中的链接以及如何分析页面中的内容, 提取生成 item 的方法。创建一个Spider  为了创建一个Spider,保存在 bbsDmoz/spiders,您必须继承 scrapy.Spider 类,且定义以下三个属性:name: 用于区别Spider。该名字必须是唯一的,您不可以为不同的Spider设定相同的名字。start_urls: 包含了Spider在启动时进行爬取的url列表。因此,第一个被获取到的页面将是其中之一。后续的URL则从初始的URL获取到的数据中提取。我们可以利用正则表达式定义和过滤需要进行跟进的链接。parse() 是spider的一个方法。被调用时,每个初始URL完成下载后生成的 Response 对象将会作为唯一的参数传递给该函数。该方法负责解析返回的数据(response data),提取数据(生成item)以及生成需要进一步处理的URL的 Request 对象。Selectors选择器  从网页中提取数据有很多方法。Scrapy使用了一种基于 XPath 和 CSS 表达式机制: Scrapy Selectors。 关于selector和其他提取机制的信息请参考 Selector文档 。  我们使用XPath来从页面的HTML源码中选择需要提取的数据。这里给出XPath表达式的例子及对应的含义:/html/head/title: 选择HTML文档中 &head& 标签内的 &title& 元素/html/head/title/text(): 选择上面提到的 &title& 元素的文字//td: 选择所有的 &td& 元素//div[@class=&mine&]: 选择所有具有 class=&mine& 属性的 div 元素  以饮水思源BBS一页面为例:https://bbs./bbstcon?board=PhD&reid=&file=M..A  观察HTML页面源码并创建我们需要的数据(种子名字,描述和大小)的XPath表达式。  通过观察,我们可以发现poster是包含在 pre/a 标签中的,这里是userid=jasperstream:123...&[href='bbspst?board=PhD&file=M..A'&回复本文&][href='bbscon?board=PhD&file=M..A'&原帖&] 发信人: href=&bbsqry?userid=jasperstream&&jasperstream&  因此可以提取jasperstream的 XPath 表达式为:1'//pre/a/text()'  同理我可以提取其他内容的XPath,并最好在提取之后验证其正确性。上边仅仅是几个简单的XPath例子,XPath实际上要比这远远强大的多。 如果您想了解的更多,我们推荐 这篇XPath教程。  为了配合XPath,Scrapy除了提供了 Selector 之外,还提供了方法来避免每次从response中提取数据时生成selector的麻烦。  Selector有四个基本的方法(点击相应的方法可以看到详细的API文档):xpath(): 传入xpath表达式,返回该表达式所对应的所有节点的selector list列表 。css(): 传入CSS表达式,返回该表达式所对应的所有节点的selector list列表.extract(): 序列化该节点为unicode字符串并返回list。re(): 根据传入的正则表达式对数据进行提取,返回unicode字符串list列表。  如提取上述的poster的数据:1sel.xpath('//pre/a/text()').extract()使用Item  Item 对象是自定义的python字典。您可以使用标准的字典语法来获取到其每个字段的值(字段即是我们之前用Field赋值的属性)。一般来说,Spider将会将爬取到的数据以 Item 对象返回。 Spider代码  以下为我们的第一个Spider代码,保存在 bbsDmoz/spiders 目录下的 forumSpider.py 文件中:1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950'''bbsSpider, Created on Oct, 2014#version: 1.0#author: chenqx @See more: http://doc.scrapy.org/en/latest/index.html'''from scrapy.selector import Selectorfrom scrapy.http import
Requestfrom scrapy.contrib.spiders import CrawlSpiderfrom scrapy.contrib.loader import ItemLoaderfrom scrapy.contrib.linkextractors.sgml import SgmlLinkExtractorfrom bbs.items import BbsItemclassforumSpider(CrawlSpider):name = 'bbsSpider'allow_domain = ['bbs.']start_urls = [ 'https://bbs./bbsall' ]link_extractor = {'page':
SgmlLinkExtractor(allow = '/bbsdoc,board,\w+\.html$'),'page_down':
SgmlLinkExtractor(allow = '/bbsdoc,board,\w+,page,\d+\.html$'),'content':
SgmlLinkExtractor(allow = '/bbscon,board,\w+,file,M\.\d+\.A\.html$'),}_x_query = {'page_content':
'//pre/text()[2]','poster'
'//pre/a/text()','forum'
'//center/text()[2]',}defparse(self, response):for link in self.link_extractor['page'].extract_links(response):yield Request(url = link.url, callback=self.parse_page)defparse_page(self, response):for link in self.link_extractor['page_down'].extract_links(response):yield Request(url = link.url, callback=self.parse_page)for link in self.link_extractor['content'].extract_links(response):yield Request(url = link.url, callback=self.parse_content)defparse_content(self, response):bbsItem_loader = ItemLoader(item=BbsItem(), response = response)url = str(response.url)bbsItem_loader.add_value('url', url)bbsItem_loader.add_xpath('forum', self._x_query['forum'])bbsItem_loader.add_xpath('poster', self._x_query['poster'])bbsItem_loader.add_xpath('content', self._x_query['page_content'])return bbsItem_loader.load_item()Define Item Pipeline  当Item在Spider中被收集之后,它将会被传递到Item Pipeline,一些组件会按照一定的顺序执行对Item的处理。  每个item pipeline组件(有时称之为“Item Pipeline”)是实现了简单方法的Python类。他们接收到Item并通过它执行一些行为,同时也决定此Item是否继续通过pipeline,或是被丢弃而不再进行处理。  以下是item pipeline的一些典型应用:清理HTML数据验证爬取的数据(检查item包含某些字段)查重(并丢弃)将爬取结果保存,如保存到数据库、XML、JSON等文件中编写 Item Pipeline  编写你自己的item pipeline很简单,每个item pipeline组件是一个独立的Python类,同时必须实现以下方法: process_item(item, spider)
  每个item pipeline组件都需要调用该方法,这个方法必须返回一个 Item (或任何继承类)对象,或是抛出 DropItem异常,被丢弃的item将不会被之后的pipeline组件所处理。
  参数:item (Item object) – 由 parse 方法返回的 Item 对象
     spider (Spider object) – 抓取到这个 Item 对象对应的爬虫对象  此外,他们也可以实现以下方法:open_spider(spider)
  当spider被开启时,这个方法被调用。
  参数: spider (Spider object) – 被开启的spider
close_spider(spider)
  当spider被关闭时,这个方法被调用,可以再爬虫关闭后进行相应的数据处理。
  参数: spider (Spider object) – 被关闭的spider  本文爬虫的item pipeline如下,保存为XML文件:12345678910111213141516171819202122232425262728293031from scrapy import signalsfrom scrapy import logfrom bbsDmoz.items import BbsDmozItemfrom twisted.enterprise import adbapifrom scrapy.contrib.exporter import XmlItemExporterfrom dataProcess import dataProcessclassXmlWritePipeline(object):def__init__(self):pass@classmethod<span class="function" style="-webkit-margin-before:
数据挖掘DW(datadw)
 文章为作者独立观点,不代表大不六文章网立场
datadw数据资源帝,致力于源源不断的资料提供。涵盖数据分析/数据挖掘,机器学习,R/Python编程,算法原理与案例,大数据,分享专家经验或观点,能为你解决数据研究相关学习、工作问题!热门文章最新文章datadw数据资源帝,致力于源源不断的资料提供。涵盖数据分析/数据挖掘,机器学习,R/Python编程,算法原理与案例,大数据,分享专家经验或观点,能为你解决数据研究相关学习、工作问题!&&&&违法和不良信息举报电话:183-
举报邮箱:Copyright(C)2017 大不六文章网使用Scrapy爬取大规模数据 - 简书
使用Scrapy爬取大规模数据
系统学习了解Python爬虫有20天时间了,做了一些爬虫小实验,如:
爬取51JOB岗位要求及信息 ;
Python模拟登录爬取QQ群论坛数据,,;
用Scrapy爬取找到简书签约作者,;
工作中爬取优酷视频,爬取筛选赶集、58简历库。
但是以上爬取的数据量都不大,最多的有一千多数条数据。于是想做一次大数据量的爬取。选择的数据源是简书用户,使用的是Scrapy框架。同时也想对简书的用户做一个数据分析。
要爬取大量数据,使用Scrapy要考虑的是新的url在哪里产生,解析的方法如何循环调用,也就是爬取的深度和广度。在Scrapy官方文档上的案例过于简单,实现的过程遇到不少问题,如scrapy中的方法如何调度,如何返回,循环中如何去抓取需要的另一个字段,再如何返回等等, 有些可能是我思维的局限,问题先记下,一步步解决。
一、考虑爬虫从哪里入口?
简书的用户id不是一个自增的序列数,无法使用一个循环就可以跑下所有用户。一开始我是想从一篇热门文章的阅读数或者喜欢数开始抓取用户,热门文章的阅读数能达到6W+,喜欢数在6~7K。但下一步数据再怎么爬,没有想好,阅读和喜欢的用户都是最普通用户,他们的关注和粉丝很少,而且阅读用户是Ajax数据。还有一个问题,数据如何去重。
后来,我再看上次爬取的简书签约作者时,发现有8个签约作者粉丝都超过1W,彭小六粉丝近3W。于是就觉得从这里作为入口,会是一个比较好的方案,简单易行,使用几个不多的url作为待爬取的入口,便可以抓取到大量的数据。最后我选择几个入口用户是,简书、彭小六、剽悍一只猫、入江之鲸、陶瓷兔子5个用户url,爬取他们的粉丝用户信息。
没有把所有签约作者url一起列为入口,是因为我现在数据存为csv格式,考虑可能超过65535行。后来我看了一下,特征用户还可以包括简叔,简书首席拒稿官。
要爬取的用户信息:
class JsuserItem(Item):
nickname = Field()
subscriptions = Field() # 用户关注数
fans = Field() #粉丝数
url = Field()
#用户首页url
articles = Field()
#写的文章数
words = Field() #写作的字数
likes = Field()
#收到的喜欢数
comments = Field()
# 发表的评论数,这个数据跳到另外url,还要做分页处理,这次没有做。
regtime = Field()
# 与评论数一样,下次再爬取
collected = Field()
二、如何使用Scrapy循环爬取数据
在上一篇文章中数据提交,获取新的url,url规则没有变,抓取的页面结构没有变,所以都是在parse()中实现。这次不一样。
1、列出start_urls, parse()方法会自动从这个待爬取的url列表依次执行。2、每一个用户的粉丝是分页加载的。所以需要一个方法获取粉丝分页url,分页页面每一行数据显示了一个用户文章数、字数、喜欢数、粉丝数,不需要进入到用户首页。
要获得用户注册时间,第一篇文章发表时间,发表过多少评论,是需要进到用户首页的,这也是下一步抓取要解决的。
在parse()方法中,我的目标就是拿到所有分页url,parse_item()中解析出用户信息并提交。在parse()方法中循环调用parse_item()。把所有特征用户的粉丝数据都抓取出来。
注意:1)在构造分页url时,查看到一个参数“_=”后面是一串数字,在浏览器中验证去掉又不行,猜测是时间戳。就用time构造出一个,测试正确。
2)在scrapy中方法调用,采用回调的方式。
for i in range(1, pages + 1):
nurl = response.url + '?_' + str(t) + '&page=' + str(i)
#构造出分页的url
yield Request(nurl, callback=self.parse_item)
看一下爬取到的数据:
到了65535行!
把数据导入数说立方,去重后的条数为64714条,重复率为1.2%,可见用户在粉以上几个签约作者时重合度并不高。
90.8%用户写了7篇文章,68.9%用户没有发表过文章
你坚持写7篇就超过90%的用户。更多数据分析,另外写一篇来解读。下一步的学习放在mongodb,redis上,练习10W+级别的数据爬取,以及Scrapy处理复杂的流程和性能优化。
抓住了,生命开始加速!比特之理 & Scrapy抓取豆瓣相册(学习笔记)|とある東雲研究所の分所
とある東雲研究所の分所
& Scrapy抓取豆瓣相册(学习笔记)
Scrapy抓取豆瓣相册(学习笔记)
情况是这样子的,因为前两天NHK的晨间剧《海女》完结了嘛,加之之前写的时候说过到时要为海女专门写一篇的,于是乎,我下午就开始写啦,我写这种文章的时候总免不了去找图,然后在那里就看到了很多好图,尤其是能年犬的,所以就想把图片全部下下来,然后轮流当桌面,但是一看下面,狗眼瞎了,1500+张,于是,按照我的性格,果断就把《海女》的博文扔一边了,跑去研究怎么全部下下来好了。。。所以呢~海女的博文,我过几天再写吧。。。
前阵子一直在自学python,其实为了就是搞python(x,y)而已,而且没有搬砖需求,纯属自娱自乐。。我一开始就知道python很适合爬虫的,而且scrapy我“觊觎”很久了,准备学会python就狠狠搞一下!!今天是个机会,反正python学了好一部分了,所以就开始搞爬虫,几个小时下来,总算尼马把目的达成了!!
这里做一下笔记吧~反正今后会时不时发神经去网上“爬”一下的。。。。首先是安装scrapy,安装scrapy你需要准备好多好多东西,嗯,真的很麻烦。。
一,首先是python,还是比较推荐2.7吧,虽然我实验室的电脑不知道为什么2.7就是用不了。。。怎么安装请上网查吧,我是因为装了pythonxy,所以我就可以略过这一步了~
二,然后是安装Twisted【Twisted is an event-driven networking engine written in Python and licensed under the open source】,其中这个又分3步,所以说麻烦啊!!
安装setuptools:下载地址
安装Zope.Interface:下载地址,下载完成后将其拷贝到XXXPython27Scripts目录下,在cmd里面cd到这个目录后,运行:
easy_install.exe zope.interface-4.0.1-py2.7-win32.egg
安装Twisted:下载地址,点击安装即可。
三,接下来是安装w3lib,下载地址,下载后解压,然后cmd进入到w3lib-1.2目录下,运行:
python setup.py install
四,下一步安装libxml2,下载地址,神烦吧!点击安装即可。
五,别急。。下一步。。安装pyOpenSSL,下载地址,还是点击安装。
六,最后一步,主角,Scrapy,下载地址,解压后cmd进入目录Scrapy-0.14.4,运行:
python setup.py install
好,战斗第一步,结束!
然后我下面简单说一下今天的学习笔记!
首先,我们需要建立一个scrapy的工程,所以在cmd下,cd到你喜欢的目录里面,运行
scrapy startproject
doubanImage
这样子我们就多了一个叫做doubanImage的文件夹,下面就是我们的工程文件了,主要关心的文件有这两个:
doubanImagedoubanImageitems.py:项目items文件
doubanImagedoubanImagespiders:爬虫代码文件夹
其他的先别管,然后我们在spiders下面建立一个py文件,假设叫douban.py,写入代码如下:
from scrapy.spider import BaseSpider
class DouBanImage(BaseSpider):
name = &douban&
allowed_domains = [&&]
start_urls = [
&/subject//photos?type=S&
def parse(self, response):
filename = 'hainv.txt'
open(filename, 'wb').write(response.body)
然后在cmd里面运行,运行方式如下:scrapy crawl douban
第三个参数douban就是类里面的变量name,
代码里面,start_urls就是你要开始爬虫的其实网址,不一定只有一个。
parse是爬虫的回调函数,在这个代码里面,我们创建了一个叫做hainv.txt的文件夹,运行之后里面将会有这个地址页面的源代码,也就是你在浏览器那个页面下,右键→源文件,所看到的那些。
但是整个页面的代码其实并不是我们想要的,我们想要的是一个html树结构的那种东西,或者说,树结构也不是我们想要的,我们想要的是类似数据库一样,我告诉你我想要什么标签的信息,你就返回什么标签的信息;
还是《海女》相册页面为例,我们查看源文件,可以看到我们感兴趣的照片都是这样一个标签下的:
&ul class=&poster-col4 clearfix&
&li data-id=&&&
&div class=&cover&&
&a href=&/photos/photo//&&
&img src=&/view/photo/thumb/public/p.jpg& /&
&div class=&prop&&
&div class=&name&&
&a href=&/photos/photo//#comments&&2回应&/a&
...........
像/photos/photo// 就是每张单独的照片的连接页面了,而/view/photo/thumb/public/p.jpg 则是缩略图的照片的地址
于是乎,我们要找的照片其实就是ul下的li下的div下的a下面的img了!!要怎么得到这个东西呢?为了方便调试,一般不会直接在代码里面调试,我们可以开一个内建的一个Scrapy shell,这样我们就像运行matlab脚本一样随写随测试,方法呢,就是在cmd里面运行:
scrapy shell 地址
我们这里自然运行的是:
scrapy shell /subject//photos?type=S
然后你就会发现进入了一个类似Ipython的界面了,要怎么获得我们刚刚上面描述的那个东西呢?输入:
hxs.select('//ul/li/div/a/@href').extract()
其实就是告诉scrapy我要ul下面的li下面的div下面的a下面的链接,但是返回来是什么呢?
[u'/photos/photo//',
u'/photos/photo//#comments',
u'/photos/photo//',
u'/photos/photo//',
u'/photos/photo//',
u'/photos/photo//',
u'/photos/photo//',
u'/photos/photo//#comments',
u'/photos/photo//',
u'/photos/photo//',
u'/photos/photo//',
u'/photos/photo//',
u'/photos/photo//#comments',
u'/photos/photo//',
u'/photos/photo//',
u'/photos/photo//#comments',
u'/photos/photo//',
u'/photos/photo//#comments',
u'/photos/photo//',
u'/photos/photo//#comments',
u'/photos/photo//',...................
除了我们要的地址外,还有很多#comments,就是每张照片下面评论的链接啦~再看看我们上面的那个页面的源代码,可以发现,确实,我们刚刚输入的规则确实应该得到comment的连接,但是我们不想要这些?怎么办呢?观察一下上面,我们发现图片的地址的div里面class是‘cover’,而评论的class是‘name’,这就是区分的准则了!!代码如下:
hxs.select("//ul/li/div[@class='cover']/a/@href").extract()
这样返回来的全部都是图片页面的地址了,再也没有comments了。
如果想直接获得缩略图的链接呢?
hxs.select("//ul/li/div[@class='cover']/a/img/@src").extract()
这样返回来的就是:
[u'/view/photo/thumb/public/p.jpg',
u'/view/photo/thumb/public/p.jpg',
u'/view/photo/thumb/public/p.jpg',
u'/view/photo/thumb/public/p.jpg',
u'/view/photo/thumb/public/p.jpg',
u'/view/photo/thumb/public/p.jpg',
u'/view/photo/thumb/public/p.jpg',
。。。。。。。。
接下来我原本的计划是,通过爬虫图片的页面地址,然后继续解析那个页面的源文件,找到图片的链接,但是我进去后就发现我太甜了,比如说这个页面,/photos/photo//,你进去就会发现没有直接的jpg的地址,那些图片的地址都是用JS函数计算出来的,虽然不算是加密,但是比较麻烦,但是在那个页面右键图片,属性,可以看到图片的URL,而且对比一下就会发现,如果缩略图的URL是:
/view/photo/thumb/public/p.jpg
那么这个图片的URL就是
/view/photo/photo/public/p.jpg
然后我们点击图片左下角的查看原图,就会发现,图片的链接是:
/view/photo/raw/public/p.jpg
区别显而易见,所以为了图个方便,我们只要向上面一样解析出缩略图thumb的地址,就可以直接用一个replace函数获得原始图片的地址了,嗯,简单。
我们计划要把所有图片的地址写到douban.txt里面,然后直接贴到迅雷里面,就可以下载了,那么代码就变成这个了:
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
class DouBanImage(BaseSpider):
name = &douban&
allowed_domains = [&&]
filename = 'douban.txt'
f = open(filename, 'wb')
start_urls = [&/subject//photos?type=S&]
def parse(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//ul/li/div/a/img/@src').extract()
for site in sites:
site = site.replace('thumb','raw')
self.f.write(site)
self.f.write('rn')
这样我们就可以完成了第二步了!!
上面的步骤我们只是保存了第一页的图片,豆瓣设定一页40张,所以我们只得到了40张,要得到下面的怎么办呢?简单,获得下一页的地址不就行了咯~
继续看豆瓣海女相册第一页页面的源代码,在下面找到:
&div class=&paginator&&
&span class=&prev&&
&span class=&thispage&&1&/span&
&a href=&/subject//photos?type=S&start=40&sortby=vote&size=a&subtype=a& &2&/a&
&a href=&/subject//photos?type=S&start=80&sortby=vote&size=a&subtype=a& &3&/a&
&a href=&/subject//photos?type=S&start=120&sortby=vote&size=a&subtype=a& &4&/a&
&a href=&/subject//photos?type=S&start=160&sortby=vote&size=a&subtype=a& &5&/a&
&a href=&/subject//photos?type=S&start=200&sortby=vote&size=a&subtype=a& &6&/a&
很明显,从上面我们不仅可以很轻易的定位出我们要跳转的那一页的地址,还可以知道当前是第几页,每个地址对应第几页这些信息,比如:
hxs.select("//div[@class='paginator']/a/@href").extract()
上面这行语句就可以获得所有的页面的链接的跳转地址
hxs.select("//div[@class='paginator']/a/text()").extract()
上面这行语句就可以获得对应的页码。
虽然一开始思路是这样子,但是我后来想想还是算了,于是我就想到了另一个比较猥琐的方法。。。就是观察每一页的地址,可以发现。。。。很有规律性的。。。start=0,40,80,120...于是乎,一个简单无比的代码就出来了,见文章最后面。因为这里还有一个东西要说一下,就是Item那个文件。
某一个页面分析完,不一定像我这种只想要图片地址的,比如说可能有人还想要每张图片的评论,所以呢,就有了Item这个文件,对于编辑items.py这个文件,每添加一个项,就是用XXX=Filed()就可以了。
向我们这里,就是:
# Define here the models for your scraped items
# See documentation in:
# http://doc.scrapy.org/topics/items.html
from scrapy.item import Item, Field
class DoubanimageItem(Item):
# define the fields for your item here like:
# name = Field()
ImageAddress = Field()
这样,就可以对他进行保存了。
所以我最后的代码就是:
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
from doubanImage.items import DoubanimageItem
class DouBanImage(BaseSpider):
name = &douban&
allowed_domains = [&&]
start_urls = [];
f = open('douban.txt', 'wb')
for i in range(0,1560,40):
start_urls.append('/subject//photos?type=S&start=%d&sortby=vote&size=a&subtype=a'%i)
def parse(self, response):
hxs = HtmlXPathSelector(response)
sites = hxs.select('//ul/li/div/a/img/@src').extract()
items = []
for site in sites:
site = site.replace('thumb','raw')
self.f.write(site)
self.f.write('\r\n')
item = DoubanimageItem()
item['ImageAddress'] = site
items.append(item)
return items
正所谓短小精悍,是吧~
但是跑完程序要怎么得到刚刚保存的item的值呢?运行的时候只要用以下参数即可:
scrapy crawl douban -o image.json -t json
这样运行完你就会看到一个image.json文件,东西就保存在那里面!!
第一,上面那个东西只是我学了一下午得到的东西的整理,入门到不能再入门。
第二,话说,我发现用迅雷下载图片的时候,最好开单个文件下载,不然豆瓣那边会拒绝。
第三,我最后发现,我自己写一个现在图片的代码要比迅雷快很多,不知为何。。迅雷自己200张下了半个多小时,我1500+张十分钟不用就下完了。。估计豆瓣那边对迅雷这种多线程有封锁吧。。这里给一下读取图片链接下载图片的小代码。。也是scrapy的。。
from scrapy.spider import BaseSpider
from scrapy.selector import HtmlXPathSelector
class DownloadImg(BaseSpider):
name = &readimg&
allowed_domains = [&&]
start_urls = [];
f = open(&F:\\readimg\\douban.txt&,'r')
line = f.readline()
while(line):
start_urls.append(line)
line = f.readline()
counter = 0;
def parse(self, response):
str = response.url[0:-3];
self.counter = self.counter+1
str = str.split('/');
print '--------------------------------DownLoad Finished',self.counter,str[-1]
imgfile = open(str[-1],'wb')
imgfile.write(response.body)
以上!【哎呀妈呀,总算写完了。。。海女的还是再等几天好了。。】
本文内容遵从CC版权协议,转载请注明出自
我勒个去。。太久没打理网站,Wordpress版本太低,被黑了都不知道。。。感谢白帽子。。
Categories
&#x25BA; (22)
&#x25BA; (2)
&#x25BA; (5)
&#x25BA; (4)
&#x25BA; (6)
&#x25BA; (28)
&#x25BA; (2)
&#x25BA; (1)
&#x25BA; (12)
&#x25BA; (3)
&#x25BA; (1)
&#x25BA; (2)
&#x25BA; (6)
&#x25BC; (48)
&#x25BA; (10)
&#x25BA; (11)
&#x25BA; (4)
&#x25BA; (9)
&#x25BA; (5)
&#x25BC; (5)
&#x25BA; (2)
&#x25BA; (1)
&#x25BA; (1)
&#x25BA; (34)
&#x25BA; (16)
&#x25BA; (2)
&#x25BA; (41)
&#x25BA; (7)
&#x25BA; (5)
&#x25BA; (3)
&#x25BA; (6)
&#x25BA; (4)
&#x25BA; (2)
&#x25BA; (10)
&#x25BA; (20)
&#x25BA; (14)
&#x25BA; (4)
collapsItems['collapsCat-150:2'] = '';
collapsItems['collapsCat-160:2'] = '';
collapsItems['collapsCat-154:2'] = '';
collapsItems['collapsCat-159:2'] = '';
collapsItems['collapsCat-2:2'] = '&#x25BA; (4)
&#x25BA; (2)
&#x25BA; (5)
&#x25BA; (4)
&#x25BA; (6)
collapsItems['collapsCat-98:2'] = '';
collapsItems['collapsCat-131:2'] = '';
collapsItems['collapsCat-164:2'] = '';
collapsItems['collapsCat-96:2'] = '';
collapsItems['collapsCat-163:2'] = '';
collapsItems['collapsCat-122:2'] = '';
collapsItems['collapsCat-97:2'] = '';
collapsItems['collapsCat-157:2'] = '';
collapsItems['collapsCat-3:2'] = '&#x25BA; (1)
&#x25BA; (2)
&#x25BA; (1)
&#x25BA; (12)
&#x25BA; (3)
&#x25BA; (1)
&#x25BA; (2)
&#x25BA; (6)
collapsItems['collapsCat-144:2'] = '';
collapsItems['collapsCat-151:2'] = '';
collapsItems['collapsCat-147:2'] = '';
collapsItems['collapsCat-152:2'] = '';
collapsItems['collapsCat-149:2'] = '';
collapsItems['collapsCat-106:2'] = '';
collapsItems['collapsCat-127:2'] = '';
collapsItems['collapsCat-155:2'] = '';
collapsItems['collapsCat-99:2'] = '';
collapsItems['collapsCat-4:2'] = '&#x25BA; (10)
&#x25BA; (11)
&#x25BA; (4)
&#x25BA; (9)
&#x25BA; (5)
&#x25BC; (5)
&#x25BA; (2)
&#x25BA; (1)
&#x25BA; (1)
collapsItems['collapsCat-95:2'] = '';
collapsItems['collapsCat-103:2'] = '';
collapsItems['collapsCat-94:2'] = '';
collapsItems['collapsCat-5:2'] = '&#x25BA; (16)
&#x25BA; (16)
&#x25BA; (2)
collapsItems['collapsCat-153:2'] = '';
collapsItems['collapsCat-120:2'] = '';
collapsItems['collapsCat-162:2'] = '';
collapsItems['collapsCat-104:2'] = '';
collapsItems['collapsCat-148:2'] = '';
collapsItems['collapsCat-139:2'] = '';
collapsItems['collapsCat-121:2'] = '';
collapsItems['collapsCat-100:2'] = '';
collapsItems['collapsCat-6:2'] = '&#x25BA; (3)
&#x25BA; (7)
&#x25BA; (5)
&#x25BA; (3)
&#x25BA; (6)
&#x25BA; (4)
&#x25BA; (2)
&#x25BA; (10)
collapsItems['collapsCat-102:2'] = '';
collapsItems['collapsCat-145:2'] = '';
collapsItems['collapsCat-101:2'] = '';
collapsItems['collapsCat-7:2'] = '&#x25BA; (2)
&#x25BA; (14)
&#x25BA; (4)
Collapse Functions, version 2.0
*--------------------------------------------------------------------------*/
String.prototype.trim = function() {
return this.replace(/^\s+|\s+$/g,"");
function createCookie(name,value,days) {
if (days) {
var date = new Date();
date.setTime(date.getTime()+(days*24*60*60*1000));
var expires = "; expires="+date.toGMTString();
var expires = "";
document.cookie = name+"="+value+expires+"; path=/";
function readCookie(name) {
var nameEQ = name + "=";
var ca = document.cookie.split(';');
for(var i=0;i
本博客所有作品遵从CC版权协议,采用进行许可。}

我要回帖

更多关于 陕西信合网银 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信