scrapy pipelines 创建的创建数据文件件,里面没数据

scrapy爬虫成长日记之将抓取内容写入mysql数据库
时间: 18:48:35
&&&& 阅读:188
&&&& 评论:
&&&& 收藏:0
标签:&&&&&&&&&&&&&&&&&&&&&&&&&&& 前面小试了一下scrapy抓取博客园的博客(您可在此查看),但是前面抓取的数据时保存为json格式的文本文件中的。这很显然不满足我们日常的实际应用,接下来看下如何将抓取的内容保存在常见的mysql数据库中吧。
  说明:所有的操作都是在&scrapy爬虫成长日记之创建工程-抽取数据-保存为json格式的数据&的基础上完成,如果您错过了这篇文章可以移步这里查看
  环境:mysql5.1.67-log
  操作步骤:
  1、检查python是否支持mysql
[root@bogon ~]# python
Python 2.7.10 (default, Jun
[GCC 4.4.4
(Red Hat 4.4.4-13)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
&&& import MySQLdb
Traceback (most recent call last):
File "&stdin&", line 1, in &module&
ImportError: No module named MySQLdb
  如果出现:ImportError: No module named MySQLdb则说明python尚未支持mysql,需要手工安装,请参考步骤2;如果没有报错,请调到步骤3
  2、python安装mysql支持
[root@bogon ~]# pip install mysql-python
Collecting mysql-python
Downloading MySQL-python-1.2.5.zip (108kB)
100% |████████████████████████████████| 110kB 115kB/s
Building wheels for collected packages: mysql-python
Running setup.py bdist_wheel for mysql-python
Stored in directory: /root/.cache/pip/wheels/8c/0d/11/d654cad764b9dd2b9e1b0cd76c22f813c5851a
Successfully built mysql-python
Installing collected packages: mysql-python
Successfully installed mysql-python-1.2.5
  安装完以后再次运行步骤1,检查python是否已经支持mysql
  如果还有问题您可以尝试:LC_ALL=C pip install mysql-python  如果依然报错:error: Python.h: No such file or directory  您可以尝试先安装python-devel:
yum install python-devel
  3、创建数据库和表
CREATE DATABASE cnblogsdb DEFAULT CHARACTER SET utf8 COLLATE utf8_general_
CREATE TABLE `cnblogsinfo` (
`linkmd5id` char(32) NOT NULL COMMENT ‘url md5编码id‘,
`title` text COMMENT ‘标题‘,
`description` text COMMENT ‘描述‘,
`link` text
COMMENT ‘url链接‘,
`listUrl` text
COMMENT ‘分页url链接‘,
`updated` datetime DEFAULT NULL
COMMENT ‘最后更新时间‘,
PRIMARY KEY (`linkmd5id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
&  注意:
    a)、创建数据库的时候加上DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci,这样才不至于出现乱码。我就因为这个问题折腾了很久。
    b)、数据库表的编码为utf8
  4、设置mysql配置信息
  根据前面的文章()我们可以知道,最终scrapy是通过pipelines.py对抓取的结果进行处理的。很显然要保存到mysql数据库中的话,修改pipelines.py这个文件是在所难免的了。然而在进行mysql操作的时候,我们需要先连上数据库,这时候就设计到数据库连接字符串的问题了。我们可以直接写死在pipelines.py文件中,但是这样又不利于程序的维护,因此我们可以考虑将配置信息写在项目的配置文件settings.py中。
  settings.py中添加如下配置项
# start MySQL database configure setting
MYSQL_HOST = ‘localhost‘
MYSQL_DBNAME = ‘cnblogsdb‘
MYSQL_USER = ‘root‘
MYSQL_PASSWD = ‘root‘
# end of MySQL database configure setting
&  5、修改pipelines.py
  修改完的结果如下,需要注意的pipelines.py中定义了两个类。JsonWithEncodingCnblogsPipeline是写入json文件用的,而MySQLStoreCnblogsPipeline(需要记住,后面会用到哦!)才是写入数据库用的。
  MySQLStoreCnblogsPipeline类做的主要功能有
    a)、读取数据库配置文件,并生成数据库实例,主要通过类方法from_settings实现,
    b)、如果url不存在则直接写入,如果url存在则更新,通过自定义的方法_do_upinsert实现,
    c)、确保url唯一性的md5函数_get_linkmd5id 。
[root@bogon cnblogs]# more 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
from scrapy import signals
import json
import codecs
from twisted.enterprise import adbapi
from datetime import datetime
from hashlib import md5
import MySQLdb
import MySQLdb.cursors
class JsonWithEncodingCnblogsPipeline(object):
def __init__(self):
self.file = codecs.open(‘cnblogs.json‘, ‘w‘, encoding=‘utf-8‘)
def process_item(self, item, spider):
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
self.file.write(line)
return item
def spider_closed(self, spider):
self.file.close()
class MySQLStoreCnblogsPipeline(object):
def __init__(self, dbpool):
self.dbpool = dbpool
@classmethod
def from_settings(cls, settings):
dbargs = dict(
host=settings[‘MYSQL_HOST‘],
db=settings[‘MYSQL_DBNAME‘],
user=settings[‘MYSQL_USER‘],
passwd=settings[‘MYSQL_PASSWD‘],
charset=‘utf8‘,
cursorclass = MySQLdb.cursors.DictCursor,
use_unicode= True,
dbpool = adbapi.ConnectionPool(‘MySQLdb‘, **dbargs)
return cls(dbpool)
#pipeline默认调用
def process_item(self, item, spider):
d = self.dbpool.runInteraction(self._do_upinsert, item, spider)
d.addErrback(self._handle_error, item, spider)
d.addBoth(lambda _: item)
#将每行更新或写入数据库中
def _do_upinsert(self, conn, item, spider):
linkmd5id = self._get_linkmd5id(item)
#print linkmd5id
now = datetime.utcnow().replace(microsecond=0).isoformat(‘ ‘)
conn.execute("""
select 1 from cnblogsinfo where linkmd5id = %s
""", (linkmd5id, ))
ret = conn.fetchone()
conn.execute("""
update cnblogsinfo set title = %s, description = %s, link = %s, listUrl = %s, updated = %s where linkmd5id = %s
""", (item[‘title‘], item[‘desc‘], item[‘link‘], item[‘listUrl‘], now, linkmd5id))
#print """
update cnblogsinfo set title = %s, description = %s, link = %s, listUrl = %s, updated = %s where linkmd5id = %s
#""", (item[‘title‘], item[‘desc‘], item[‘link‘], item[‘listUrl‘], now, linkmd5id)
conn.execute("""
insert into cnblogsinfo(linkmd5id, title, description, link, listUrl, updated)
values(%s, %s, %s, %s, %s, %s)
""", (linkmd5id, item[‘title‘], item[‘desc‘], item[‘link‘], item[‘listUrl‘], now))
#print """
insert into cnblogsinfo(linkmd5id, title, description, link, listUrl, updated)
values(%s, %s, %s, %s, %s, %s)
#""", (linkmd5id, item[‘title‘], item[‘desc‘], item[‘link‘], item[‘listUrl‘], now)
#获取url的md5编码
def _get_linkmd5id(self, item):
#url进行md5处理,为避免重复采集设计
return md5(item[‘link‘]).hexdigest()
def _handle_error(self, failue, item, spider):
log.err(failure)
&  6、启用MySQLStoreCnblogsPipeline类,让它工作起来
  修改setting.py配置文件,添加MySQLStoreCnblogsPipeline的支持
ITEM_PIPELINES = {
‘cnblogs.pipelines.JsonWithEncodingCnblogsPipeline‘: 300,
‘cnblogs.pipelines.MySQLStoreCnblogsPipeline‘: 300,
  至此,所有的需要修改的文件都修改好了,下面测试看结果如何。
  7、测试
[root@bogon cnblogs]# scrapy crawl CnblogsSpider
  查看数据库结果:
  至此,scrapy抓取网页内容写入数据库的功能就已经实现了。然而这个爬虫的功能还太弱小了,最基本的文件下载、分布式抓取等都功能都还不具备;同时也试想一下现在很多网站的反爬虫抓取的,万一碰到这样的网站我们要怎么处理呢?接下来的一段时间里我们来逐一解决这些问题吧。随便畅想一下,如果爬虫足够强,内容足够多;我们是不是可以打造一个属于自己的垂直搜索引擎呢?想想就兴奋,尽情YY去吧!!!
  最后源码更新至此:
/Article/44862标签:&&&&&&&&&&&&&&&&&&&&&&&&&&&原文:/lixiuran/p/4923965.html
教程昨日排行
&&国之画&&&& &&&&&&
&& &&&&&&&&&&&&&&
鲁ICP备号-4
打开技术之扣,分享程序人生!&&35729 阅读
Scrapy简介
Scrapy是Python开发的一个快速,高层次的屏幕抓取和Web抓取框架,用于抓取Web站点并从页面中提取结构化的数据。
下图展示了Scrapy的大致架构,其中包含了主要组件和系统的数据处理流程(绿色箭头表示)。下面会对组件和流程进行了一个简单的解释。
1.Scrapy Engine(Scrapy引擎)
Scrapy引擎是用来控制整个系统的数据处理流程,并进行事务处理的触发。更多的详细内容可以看下面的数据处理流程。
2.Scheduler(调度程序)
调度程序从Scrapy引擎接受请求并排序列入队列,并在Scrapy引擎发出请求后返还给它们。
3.Downloader(下载器)
下载器的主要职责是抓取网页并将网页内容返还给蜘蛛(Spiders)。
4.Spiders(蜘蛛)
蜘蛛是有Scrapy用户自己定义用来解析网页并抓取制定URL返回的内容的类,每个蜘蛛都能处理一个域名或一组域名。换句话说就是用来定义特定网站的抓取和解析规则。
5.Item Pipeline(项目管道)
项目管道的主要责任是负责处理有蜘蛛从网页中抽取的项目,它的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。每个项目管道的组件都是有一个简单的方法组成的Python类。它们获取了项目并执行它们的方法,同时还需要确定的是是否需要在项目管道中继续执行下一步或是直接丢弃掉不处理。
项目管道通常执行的过程有:
清洗HTML数据
验证解析到的数据(检查项目是否包含必要的字段)
检查是否是重复数据(如果重复就删除)
将解析到的数据存储到数据库中
6.Middlewares(中间件)
中间件是介于Scrapy引擎和其他组件之间的一个钩子框架,主要是为了提供一个自定义的代码来拓展Scrapy的功能。
数据处理流程
Scrapy的整个数据处理流程有Scrapy引擎进行控制,其主要的运行方式为:
引擎打开一个域名,时蜘蛛处理这个域名,并让蜘蛛获取第一个爬取的URL。
引擎从蜘蛛那获取第一个需要爬取的URL,然后作为请求在调度中进行调度。
引擎从调度那获取接下来进行爬取的页面。
调度将下一个爬取的URL返回给引擎,引擎将它们通过下载中间件发送到下载器。
当网页被下载器下载完成以后,响应内容通过下载中间件被发送到引擎。
引擎收到下载器的响应并将它通过蜘蛛中间件发送到蜘蛛进行处理。
蜘蛛处理响应并返回爬取到的项目,然后给引擎发送新的请求。
引擎将抓取到的项目项目管道,并向调度发送请求。
系统重复第二部后面的操作,直到调度中没有请求,然后断开引擎与域之间的联系。
在开始之前,我假定你已经安装了Scrapy。如果你还没有安装成功,具体的安装过程请参考,Win7 64位的请参考此。(不过说实话,安装Scrapy真心蛋疼啊,因为它需要安装很多其他依赖的组件,出现各种异常问题在StackOverflow找解决办法吧。)
这次我们来用爬虫获取豆瓣电影Top 250的电影信息吧。开始之前,我们新建一个Scrapy工程。因为我用的Win7,所以在CMD中进入一个我希望保存代码的目录,然后执行:
D:\WEB\Python&scrapy startproject doubanmoive
这个命令会在当前目录下创建一个新的目录doubanmoive,目录结构如下:
D:\WEB\Python\doubanmoive&tree /f
Folder PATH listing for volume Data
Volume serial number is EC:9CB9
scrapy.cfg
└─doubanmoive
pipelines.py
settings.py
__init__.py
└─spiders
__init__.py
这些文件主要为:
doubanmoive/items.py:定义需要获取的内容字段,类似于实体类。
doubanmoive/pipelines.py:项目管道文件,用来处理Spider抓取的数据。
doubanmoive/settings.py:项目配置文件
doubanmoive/spiders:放置spider的目录
定义项目(Item)
Item是用来装载抓取数据的容器,和Java里的实体类(Entity)比较像,打开doubanmoive/items.py可以看到默认创建了以下代码。
from scrapy.item import Item, Field
class DoubanmoiveItem(Item):
我们只需要在Doubanmoive类中增加需要抓取的字段即可,如name=Field(),最后根据我们的需求完成代码如下。
from scrapy.item import Item, Field
class DoubanmoiveItem(Item):
name=Field()#电影名
year=Field()#上映年份
score=Field()#豆瓣分数
director=Field()#导演
classification=Field()#分类
actor=Field()#演员
编写爬虫(Spider)
Spider是整个项目中最核心的类,在这个类里我们会定义抓取对象(域名、URL)以及抓取规则。Scrapy官方文档中的教程是基于BaseSpider的,但BaseSpider只能爬取给定的URL列表,无法根据一个初始的URL向外拓展。不过除了BaseSpider,还有很多可以直接继承Spider的类,比如scrapy.contrib.spiders.CrawlSpider。
在doubanmoive/spiders目录下新建moive_spider.py文件,并填写代码。
# -*- coding: utf-8 -*-
from scrapy.selector import Selector
from scrapy.contrib.spiders import CrawlSpider,Rule
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from doubanmoive.items import DoubanmoiveItem
class MoiveSpider(CrawlSpider):
name=&doubanmoive&
allowed_domains=[&&]
start_urls=[&/top250&]
Rule(SgmlLinkExtractor(allow=(r'/top250\?start=\d+.*'))),
Rule(SgmlLinkExtractor(allow=(r'/subject/\d+')),callback=&parse_item&),
def parse_item(self,response):
sel=Selector(response)
item=DoubanmoiveItem()
item['name']=sel.xpath('//*[@id=&content&]/h1/span[1]/text()').extract()
item['year']=sel.xpath('//*[@id=&content&]/h1/span[2]/text()').re(r'\((\d+)\)')
item['score']=sel.xpath('//*[@id=&interest_sectl&]/div/p[1]/strong/text()').extract()
item['director']=sel.xpath('//*[@id=&info&]/span[1]/a/text()').extract()
item['classification']= sel.xpath('//span[@property=&v:genre&]/text()').extract()
item['actor']= sel.xpath('//*[@id=&info&]/span[3]/a[1]/text()').extract()
return item
代码说明:MoiveSpider继承Scrapy中的CrawlSpider,name , allow_domains , start_url看名字就知道什么含义,其中rules稍微复杂一些,定义了URL的抓取规则,符合allow正则表达式的链接都会加入到Scheduler(调度程序)。通过分析豆瓣电影Top250的分页URL/top250?start=25&filter=&type=可以得到以下规则:
Rule(SgmlLinkExtractor(allow=(r'/top250\?start=\d+.*'))),
而我们真正要抓取的页面是每一个电影的详细介绍,如《肖申克的救赎》的链接为/subject/1292052/,那只有subject后面的数字是变化的,根据正则表达式得到如下代码。我们需要抓取这种类型链接中的内容,于是加入callback属性,将Response交给parse_item函数来处理。
Rule(SgmlLinkExtractor(allow=(r'/subject/\d+')),callback=&parse_item&),
在parse_item函数中的处理逻辑非常简单,获取符合条件链接的代码,然后根据一定的规则抓取内容赋给item并返回Item Pipeline。获取大部分标签的内容不需要编写复杂的正则表达式,我们可以使用XPath。
XPath 是一门在 XML 文档中查找信息的语言,但它也可以用在HTML中。下表列出了常用表达式。
选取此节点的所有子节点。
从根节点选取。
从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。
选取当前节点。
选取当前节点的父节点。
选取属性。
如//*[@id=&content&]/h1/span[1]/text()获取的结果是在id为content的任意元素下h1元素下的span列表中第一个元素的文本内容。我们可以通过Chrome开发者工具(F12)来获取某内容的XPath表达式,具体操作为在需要抓取的内容上点击审查元素,下方就会出现开发者工具,并定位到该元素,在内容上点击右键,选择复制XPath。
爬虫获取到数据以后我们需要将其存储到数据库中,之前我们提到该操作需要靠项目管道(pipeline)来处理,其通常执行的操作为:
清洗HTML数据
验证解析到的数据(检查项目是否包含必要的字段)
检查是否是重复数据(如果重复就删除)
将解析到的数据存储到数据库中
由于我们获取的数据格式多种多样,有一些存储在关系型数据库中并不方便,所以我在写完MySQL版本的Pipeline之后又写了一个MongoDB的。
MySQL代码:
# -*- coding: utf-8 -*-
from scrapy import log
from twisted.enterprise import adbapi
from scrapy.http import Request
import MySQLdb
import MySQLdb.cursors
class DoubanmoivePipeline(object):
def __init__(self):
self.dbpool = adbapi.ConnectionPool('MySQLdb',
db = 'python',
user = 'root',
passwd = 'root',
cursorclass = MySQLdb.cursors.DictCursor,
charset = 'utf8',
use_unicode = False
def process_item(self, item, spider):
query = self.dbpool.runInteraction(self._conditional_insert, item)
query.addErrback(self.handle_error)
return item
def _conditional_insert(self,tx,item):
tx.execute(&select * from doubanmoive where m_name= %s&,(item['name'][0],))
result=tx.fetchone()
log.msg(result,level=log.DEBUG)
print result
if result:
log.msg(&Item already stored in db:%s& % item,level=log.DEBUG)
classification=actor=''
lenClassification=len(item['classification'])
lenActor=len(item['actor'])
for n in xrange(lenClassification):
classification+=item['classification'][n]
if n&lenClassification-1:
classification+='/'
for n in xrange(lenActor):
actor+=item['actor'][n]
if n&lenActor-1:
actor+='/'
tx.execute(\
&insert into doubanmoive (m_name,m_year,m_score,m_director,m_classification,m_actor) values (%s,%s,%s,%s,%s,%s)&,\
(item['name'][0],item['year'][0],item['score'][0],item['director'][0],classification,actor))
log.msg(&Item stored in db: %s& % item, level=log.DEBUG)
def handle_error(self, e):
log.err(e)
MongoDB代码:
# -*- coding: utf-8 -*-
import pymongo
from scrapy.exceptions import DropItem
from scrapy.conf import settings
from scrapy import log
class MongoDBPipeline(object):
#Connect to the MongoDB database
def __init__(self):
connection = pymongo.Connection(settings['MONGODB_SERVER'], settings['MONGODB_PORT'])
db = connection[settings['MONGODB_DB']]
self.collection = db[settings['MONGODB_COLLECTION']]
def process_item(self, item, spider):
#Remove invalid data
valid = True
for data in item:
if not data:
valid = False
raise DropItem(&Missing %s of blogpost from %s& %(data, item['url']))
#Insert data into database
new_moive=[{
&name&:item['name'][0],
&year&:item['year'][0],
&score&:item['score'][0],
&director&:item['director'],
&classification&:item['classification'],
&actor&:item['actor']
self.collection.insert(new_moive)
log.msg(&Item wrote to MongoDB database %s/%s& %
(settings['MONGODB_DB'], settings['MONGODB_COLLECTION']),
level=log.DEBUG, spider=spider)
return item
可以看到其基本的处理流程是一样,但是MySQL不太方便的一点就是需要将数组类型的数据通过分隔符转换。而MongoDB支持存入List、Dict等多种类型的数据。
在运行爬虫之前还需要将在settings.py中增加一些配置信息。
BOT_NAME = 'doubanmoive'
SPIDER_MODULES = ['doubanmoive.spiders']
NEWSPIDER_MODULE = 'doubanmoive.spiders'
ITEM_PIPELINES={
'doubanmoive.mongo_pipelines.MongoDBPipeline':300,
'doubanmoive.pipelines.DoubanmoivePipeline':400,
LOG_LEVEL='DEBUG'
DOWNLOAD_DELAY = 2
RANDOMIZE_DOWNLOAD_DELAY = True
USER_AGENT = 'Mozilla/5.0 (M Intel Mac OS X 10_8_3) AppleWebKit/536.5 (KHTML, like Gecko) Chrome/19.0.1084.54 Safari/536.5'
COOKIES_ENABLED = True
MONGODB_SERVER = 'localhost'
MONGODB_PORT = 27017
MONGODB_DB = 'python'
MONGODB_COLLECTION = 'test'
ITEM_PIPELINES中定义了MySQL和MongoDB两个Pipeline文件,后面的数字代表执行的优先级顺序,范围为0~1000。而中间的DOWNLOAD_DELAY等信息是为了防止爬虫被豆瓣Ban掉,增加了一些随机延迟,浏览器代理等。最后的就是MongoDB的配置信息,MySQL也可以参考这种方式来写。
至此为止,抓取豆瓣电影的爬虫就已经完成了。在命令行中执行Scrapy crawl doubanmoive让蜘蛛开始爬行吧!数据分析——爬虫初体验8 months ago这是python2.7的安装,python3.5略微麻烦,需要手动安装一些库,不过在pycharm里一键安装也是可以的。二. 建立项目先来看一下要爬取的页面模样进入要存储代码的工作目录【比如D盘】,运行以下命令:进入要存储代码的工作目录【比如D盘】,运行以下命令:scrapy startproject soufangwang
soufangwang是项目的名称,此时D盘会出现一个名为soufangwang的文件夹,用pycharm打开文件夹,可以看到Scrapy的框架结构:其中spiders文件夹需要新建爬虫文件,其他.py文件有默认的代码供参考。 其中spiders文件夹需要新建爬虫文件,其他.py文件有默认的代码供参考。 三. 编写items这个里面用来定义需要爬取的字段,这里字段命名比较随意:import scrapy
class SoufangwangItem(scrapy.Item):
title = scrapy.Field()
desc1 = scrapy.Field()
desc2_1 = scrapy.Field()
desc2_2 = scrapy.Field()
desc2_3 = scrapy.Field()
desc2_4 = scrapy.Field()
price = scrapy.Field()
四. 编写spider
在spiders目录下新建一个爬虫文件,用于定义爬虫的名称,域名范围,初始的URL,分析提取页面的内容,以及跟进后续的链接。import scrapy
from scrapy.http import Request
from soufangwang.items import SoufangwangItem
class soufangwangspider(scrapy.Spider):
name = 'sfw_hangzhou'
allowed_domains = ["newhouse."]
start_urls = [
"http://newhouse./house/s/b810-b91-c9y/"
# 解析页面
def parse(self, response):
items = []
for info in response.xpath('//div[@class="finfo"]'):
item = SoufangwangItem()
item['title'] = info.xpath('h3/a/text()').extract()
item['desc1'] = info.xpath('p/span/@title').extract()
item['desc2_1'] = info.xpath('div[@class="fl guanjianzi hidden mt20"]/a[1]/text()').extract()
item['desc2_2'] = info.xpath('div[@class="fl guanjianzi hidden mt20"]/a[2]/text()').extract()
item['desc2_3'] = info.xpath('div[@class="fl guanjianzi hidden mt20"]/a[3]/text()').extract()
item['desc2_4'] = info.xpath('div[@class="fl guanjianzi hidden mt20"]/a[4]/text()').extract()
item['price'] = response.xpath('//div[@class="fprice"]/div[@class="price"]/span[1]/text()').extract()[i]
items.append(item)
yield item
next_url = response.xpath('//ul[@class="clearfix"]/li[@class="fr"]/a[@class="next"]/@href').extract()
if next_url:
next_url = 'http://newhouse.' + next_url[0]
# 爬取每一页
yield Request(next_url, self.parse)
Scrapy默认使用xpath语法提取需要的信息,我使用的是firefox浏览器的xpath checker插件来检查xpath语句,确保不会出错。五. 编写pipelines
pipelines用来编写存储数据方式,由于自己电脑上没有装数据库,这里把爬取的数据存为Json文件。import json
import codecs
class JsonWithEncodingCnblogsPipeline(object):
def __init__(self):
# 打开文件
self.file = codecs.open('fangjia.json', 'w', encoding='utf-8')
# 处理数据
def process_item(self, item, spider):
# 读取item中的数据
line = json.dumps(dict(item), ensure_ascii=False) + "\n"
# 写入文件
self.file.write(line)
# 返回item
return item
def spider_closed(self, spider):
self.file.close()
六. 编写setting
此文件是配置文件,用来设置一些参数# 设置用户代理
USER_AGENT = 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0. Safari/537.36'
# 设置延迟请求
DOWNLOAD_DELAY = 3
# pipelines设置
ITEM_PIPELINES = {
'soufangwang.pipelines.JsonWithEncodingCnblogsPipeline': 300,
七. 编写main文件
在soufangwang同级目录下创建main.py文件,用来运行爬虫。from scrapy import cmdline
cmdline.execute("scrapy crawl sfw_hangzhou".split())
八. 运行爬虫
运行main.py文件,得到的json文件如下图:以上就是一个Scrapy入门小例子,附上。赞赏还没有人赞赏,快来当第一个赞赏的人吧!0收藏分享举报文章被以下专栏收录数据分析菜鸟的成长之路推荐阅读{&debug&:false,&apiRoot&:&&,&paySDK&:&https:\u002F\\u002Fapi\u002Fjs&,&wechatConfigAPI&:&\u002Fapi\u002Fwechat\u002Fjssdkconfig&,&name&:&production&,&instance&:&column&,&tokens&:{&X-XSRF-TOKEN&:null,&X-UDID&:null,&Authorization&:&oauth c3cef7c66aa9e6a1e3160e20&}}{&database&:{&Post&:{&&:{&isPending&:false,&contributes&:[{&sourceColumn&:{&lastUpdated&:,&description&:&不定时更新数据分析小知识&,&permission&:&COLUMN_PUBLIC&,&memberId&:,&contributePermission&:&COLUMN_PUBLIC&,&translatedCommentPermission&:&all&,&canManage&:true,&intro&:&数据分析菜鸟的成长之路&,&urlToken&:&zhouchengcheng&,&id&:28295,&imagePath&:&v2-1e49afed1b6fc41af87506d.jpg&,&slug&:&zhouchengcheng&,&applyReason&:&0&,&name&:&ZCC数据分析&,&title&:&ZCC数据分析&,&url&:&https:\u002F\\u002Fzhouchengcheng&,&commentPermission&:&COLUMN_ALL_CAN_COMMENT&,&canPost&:true,&created&:,&state&:&COLUMN_NORMAL&,&followers&:1,&avatar&:{&id&:&v2-1e49afed1b6fc41af87506d&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&activateAuthorRequested&:false,&following&:false,&imageUrl&:&https:\u002F\\u002Fv2-1e49afed1b6fc41af87506d_l.jpg&,&articlesCount&:2},&state&:&accepted&,&targetPost&:{&titleImage&:&https:\u002F\\u002Fv2-258da83ebe1e73ce0f4da2_r.jpg&,&lastUpdated&:,&imagePath&:&v2-258da83ebe1e73ce0f4da2.jpg&,&permission&:&ARTICLE_PUBLIC&,&topics&:[4,135392],&summary&:&之前由于工作需要开始研究爬虫,发现使用Scrapy框架还挺好用,比写urllib方便很多,这里简单写个爬虫来记录下学习心得。目标:爬取搜房网杭州市新房信息语言:python 2.7浏览器:Firefox一. 安装Scrapy 如果没有安装Anaconda环境,安装Scrapy会非常繁琐,这…&,&copyPermission&:&ARTICLE_COPYABLE&,&translatedCommentPermission&:&all&,&likes&:0,&origAuthorId&:0,&publishedTime&:&T21:01:34+08:00&,&sourceUrl&:&&,&urlToken&:,&id&:2363978,&withContent&:false,&slug&:,&bigTitleImage&:false,&title&:&数据分析——爬虫初体验&,&url&:&\u002Fp\u002F&,&commentPermission&:&ARTICLE_ALL_CAN_COMMENT&,&snapshotUrl&:&&,&created&:,&comments&:0,&columnId&:28295,&content&:&&,&parentId&:0,&state&:&ARTICLE_PUBLISHED&,&imageUrl&:&https:\u002F\\u002Fv2-258da83ebe1e73ce0f4da2_r.jpg&,&author&:{&bio&:&愤怒的打工者&,&isFollowing&:false,&hash&:&1fc6f1dfcc87b392820c&,&uid&:16,&isOrg&:false,&slug&:&zhouchengcheng&,&isFollowed&:false,&description&:&每个人每天忙忙碌碌中要听到多少谎言&,&name&:&zccc&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fzhouchengcheng&,&avatar&:{&id&:&v2-cbd97e0a980a5a7daf1485&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&memberId&:,&excerptTitle&:&&,&voteType&:&ARTICLE_VOTE_CLEAR&},&id&:560648}],&title&:&数据分析——爬虫初体验&,&author&:&zhouchengcheng&,&content&:&\u003Cblockquote\u003E\u003Cp\u003E之前由于工作需要开始研究爬虫,发现使用Scrapy框架还挺好用,比写urllib方便很多,这里简单写个爬虫来记录下学习心得。\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E\u003Cp\u003E目标:爬取搜房网杭州市新房信息\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E语言:python 2.7\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003Cli\u003E\u003Cp\u003E浏览器:Firefox\u003C\u002Fp\u003E\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003C\u002Fblockquote\u003E\u003Ch4\u003E一. 安装Scrapy \u003C\u002Fh4\u003E\u003Cp\u003E
如果没有安装Anaconda环境,安装Scrapy会非常繁琐,这里提一下Anaconda环境下的安装,在开始界面的Anaconda文件夹下打开Anaconda Prompt,输入:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Epip install scrapy\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003E这是python2.7的安装,python3.5略微麻烦,需要手动安装一些库,不过在pycharm里一键安装也是可以的。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ch4\u003E二. 建立项目\u003C\u002Fh4\u003E\u003Cp\u003E先来看一下要爬取的页面模样\u003C\u002Fp\u003E\u003Cp\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\\u002Fv2-11f9ce878e1783efe9c3c_b.png\& data-rawwidth=\&898\& data-rawheight=\&479\& class=\&origin_image zh-lightbox-thumb\& width=\&898\& data-original=\&https:\u002F\\u002Fv2-11f9ce878e1783efe9c3c_r.png\&\u003E进入要存储代码的工作目录【比如D盘】,运行以下命令:\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='898'%20height='479'&&\u002Fsvg&\& data-rawwidth=\&898\& data-rawheight=\&479\& class=\&origin_image zh-lightbox-thumb lazy\& width=\&898\& data-original=\&https:\u002F\\u002Fv2-11f9ce878e1783efe9c3c_r.png\& data-actualsrc=\&https:\u002F\\u002Fv2-11f9ce878e1783efe9c3c_b.png\&\u003E进入要存储代码的工作目录【比如D盘】,运行以下命令:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003Escrapy startproject soufangwang\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003Esoufangwang是项目的名称,此时D盘会出现一个名为soufangwang的文件夹,用pycharm打开文件夹,可以看到Scrapy的框架结构:\u003C\u002Fp\u003E\u003Cp\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\\u002Fv2-2ddeb2ffc0a06_b.png\& data-rawwidth=\&289\& data-rawheight=\&309\& class=\&content_image\& width=\&289\&\u003E其中spiders文件夹需要新建爬虫文件,其他.py文件有默认的代码供参考。 \u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='289'%20height='309'&&\u002Fsvg&\& data-rawwidth=\&289\& data-rawheight=\&309\& class=\&content_image lazy\& width=\&289\& data-actualsrc=\&https:\u002F\\u002Fv2-2ddeb2ffc0a06_b.png\&\u003E其中spiders文件夹需要新建爬虫文件,其他.py文件有默认的代码供参考。 \u003Cbr\u003E\u003C\u002Fp\u003E\u003Ch4\u003E三. 编写items\u003C\u002Fh4\u003E\u003Cp\u003E这个里面用来定义需要爬取的字段,这里字段命名比较随意:\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Escrapy\u003C\u002Fspan\u003E\n\n\u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003ESoufangwangItem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Escrapy\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EItem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Etitle\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Escrapy\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EField\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Edesc1\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Escrapy\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EField\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Edesc2_1\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Escrapy\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EField\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Edesc2_2\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Escrapy\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EField\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Edesc2_3\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Escrapy\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EField\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Edesc2_4\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Escrapy\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EField\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eprice\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Escrapy\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003EField\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Ch4\u003E四. 编写spider \u003C\u002Fh4\u003E\u003Ch4\u003E
在spiders目录下新建一个爬虫文件,用于定义爬虫的名称,域名范围,初始的URL,分析提取页面的内容,以及跟进后续的链接。\u003C\u002Fh4\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Escrapy\u003C\u002Fspan\u003E\n\u003Cspan class=\&kn\&\u003Efrom\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Escrapy.http\u003C\u002Fspan\u003E \u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ERequest\u003C\u002Fspan\u003E\n\u003Cspan class=\&kn\&\u003Efrom\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Esoufangwang.items\u003C\u002Fspan\u003E \u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ESoufangwangItem\u003C\u002Fspan\u003E\n\u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003Esoufangwangspider\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Escrapy\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003ESpider\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Ename\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&s1\&\u003E'sfw_hangzhou'\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eallowed_domains\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&newhouse.\&\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Estart_urls\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\n
\u003Cspan class=\&s2\&\u003E\&http:\u002F\u002Fnewhouse.\u002Fhouse\u002Fs\u002Fb810-b91-c9y\u002F\&\u003C\u002Fspan\u003E\n
\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E\n
\u003Cspan class=\&c1\&\u003E# 解析页面\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Eparse\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eresponse\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eitems\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&p\&\u003E[]\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Ei\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&mi\&\u003E0\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Efor\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Einfo\u003C\u002Fspan\u003E \u003Cspan class=\&ow\&\u003Ein\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eresponse\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Expath\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'\u002F\u002Fdiv[@class=\&finfo\&]'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eitem\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ESoufangwangItem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eitem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'title'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Einfo\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Expath\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'h3\u002Fa\u002Ftext()'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eextract\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eitem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'desc1'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Einfo\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Expath\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'p\u002Fspan\u002F@title'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eextract\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eitem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'desc2_1'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Einfo\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Expath\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'div[@class=\&fl guanjianzi hidden mt20\&]\u002Fa[1]\u002Ftext()'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eextract\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eitem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'desc2_2'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Einfo\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Expath\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'div[@class=\&fl guanjianzi hidden mt20\&]\u002Fa[2]\u002Ftext()'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eextract\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eitem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'desc2_3'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Einfo\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Expath\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'div[@class=\&fl guanjianzi hidden mt20\&]\u002Fa[3]\u002Ftext()'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eextract\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eitem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'desc2_4'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Einfo\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Expath\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'div[@class=\&fl guanjianzi hidden mt20\&]\u002Fa[4]\u002Ftext()'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eextract\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eitem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'price'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eresponse\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Expath\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'\u002F\u002Fdiv[@class=\&fprice\&]\u002Fdiv[@class=\&price\&]\u002Fspan[1]\u002Ftext()'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eextract\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()[\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ei\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Ei\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ei\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E1\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eitems\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eappend\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eitem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Eyield\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eitem\u003C\u002Fspan\u003E\n
\u003Cspan class=\&c1\&\u003E# 翻页\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Enext_url\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eresponse\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Expath\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'\u002F\u002Ful[@class=\&clearfix\&]\u002Fli[@class=\&fr\&]\u002Fa[@class=\&next\&]\u002F@href'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eextract\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Eif\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Enext_url\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E:\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Enext_url\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&s1\&\u003E'http:\u002F\u002Fnewhouse.'\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Enext_url\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E[\u003C\u002Fspan\u003E\u003Cspan class=\&mi\&\u003E0\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E]\u003C\u002Fspan\u003E\n
\u003Cspan class=\&c1\&\u003E# 爬取每一页\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Eyield\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003ERequest\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Enext_url\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eparse\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Cp\u003EScrapy默认使用xpath语法提取需要的信息,我使用的是firefox浏览器的xpath checker插件来检查xpath语句,确保不会出错。\u003Cbr\u003E\u003C\u002Fp\u003E\u003Ch4\u003E五. 编写pipelines\u003C\u002Fh4\u003E\u003Cp\u003E
pipelines用来编写存储数据方式,由于自己电脑上没有装数据库,这里把爬取的数据存为Json文件。\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Ejson\u003C\u002Fspan\u003E\n\u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Ecodecs\u003C\u002Fspan\u003E\n\u003Cspan class=\&k\&\u003Eclass\u003C\u002Fspan\u003E \u003Cspan class=\&nc\&\u003EJsonWithEncodingCnblogsPipeline\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&nb\&\u003Eobject\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003E__init__\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&c1\&\u003E# 打开文件\u003C\u002Fspan\u003E\n
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efile\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ecodecs\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eopen\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'fangjia.json'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&s1\&\u003E'w'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eencoding\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&s1\&\u003E'utf-8'\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n
\u003Cspan class=\&c1\&\u003E# 处理数据
\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Eprocess_item\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eitem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Espider\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&c1\&\u003E# 读取item中的数据\u003C\u002Fspan\u003E\n
\u003Cspan class=\&n\&\u003Eline\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ejson\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Edumps\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&nb\&\u003Edict\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eitem\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E),\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eensure_ascii\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E=\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003EFalse\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E \u003Cspan class=\&o\&\u003E+\u003C\u002Fspan\u003E \u003Cspan class=\&s2\&\u003E\&\u003C\u002Fspan\u003E\u003Cspan class=\&se\&\u003E\\n\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&\u003C\u002Fspan\u003E\n
\u003Cspan class=\&c1\&\u003E# 写入文件\u003C\u002Fspan\u003E\n
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efile\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Ewrite\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eline\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E)\u003C\u002Fspan\u003E\n
\u003Cspan class=\&c1\&\u003E# 返回item\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Ereturn\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Eitem\u003C\u002Fspan\u003E\n
\u003Cspan class=\&k\&\u003Edef\u003C\u002Fspan\u003E \u003Cspan class=\&nf\&\u003Espider_closed\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E,\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Espider\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E):\u003C\u002Fspan\u003E\n
\u003Cspan class=\&bp\&\u003Eself\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Efile\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eclose\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E()\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Ch4\u003E六. 编写setting\u003C\u002Fh4\u003E\u003Cp\u003E
此文件是配置文件,用来设置一些参数\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-text\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E# 设置用户代理\nUSER_AGENT = 'Mozilla\u002F5.0 (Windows NT 6.1; Win64; x64) AppleWebKit\u002F537.36 (KHTML, like Gecko) Chrome\u002F53.0. Safari\u002F537.36'\n# 设置延迟请求\nDOWNLOAD_DELAY = 3\n# pipelines设置\nITEM_PIPELINES = {\n
'soufangwang.pipelines.JsonWithEncodingCnblogsPipeline': 300,\n}\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Ch4\u003E七. 编写main文件\u003C\u002Fh4\u003E\u003Cp\u003E
在soufangwang同级目录下创建main.py文件,用来运行爬虫。\u003C\u002Fp\u003E\u003Cdiv class=\&highlight\&\u003E\u003Cpre\u003E\u003Ccode class=\&language-python\&\u003E\u003Cspan\u003E\u003C\u002Fspan\u003E\u003Cspan class=\&kn\&\u003Efrom\u003C\u002Fspan\u003E \u003Cspan class=\&nn\&\u003Escrapy\u003C\u002Fspan\u003E \u003Cspan class=\&kn\&\u003Eimport\u003C\u002Fspan\u003E \u003Cspan class=\&n\&\u003Ecmdline\u003C\u002Fspan\u003E\n\u003Cspan class=\&n\&\u003Ecmdline\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Eexecute\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E(\u003C\u002Fspan\u003E\u003Cspan class=\&s2\&\u003E\&scrapy crawl sfw_hangzhou\&\u003C\u002Fspan\u003E\u003Cspan class=\&o\&\u003E.\u003C\u002Fspan\u003E\u003Cspan class=\&n\&\u003Esplit\u003C\u002Fspan\u003E\u003Cspan class=\&p\&\u003E())\u003C\u002Fspan\u003E\n\u003C\u002Fcode\u003E\u003C\u002Fpre\u003E\u003C\u002Fdiv\u003E\u003Ch4\u003E八. 运行爬虫\u003C\u002Fh4\u003E\u003Cp\u003E
运行main.py文件,得到的json文件如下图:\u003C\u002Fp\u003E\u003Cnoscript\u003E\u003Cimg src=\&https:\u002F\\u002Fv2-dd64c724eef5c00ae7177fd_b.png\& data-rawwidth=\&982\& data-rawheight=\&460\& class=\&origin_image zh-lightbox-thumb\& width=\&982\& data-original=\&https:\u002F\\u002Fv2-dd64c724eef5c00ae7177fd_r.png\&\u003E\u003C\u002Fnoscript\u003E\u003Cimg src=\&data:image\u002Fsvg+utf8,&svg%20xmlns='http:\u002F\u002Fwww.w3.org\u002FFsvg'%20width='982'%20height='460'&&\u002Fsvg&\& data-rawwidth=\&982\& data-rawheight=\&460\& class=\&origin_image zh-lightbox-thumb lazy\& width=\&982\& data-original=\&https:\u002F\\u002Fv2-dd64c724eef5c00ae7177fd_r.png\& data-actualsrc=\&https:\u002F\\u002Fv2-dd64c724eef5c00ae7177fd_b.png\&\u003E\u003Cul\u003E\u003Cli\u003E以上就是一个Scrapy入门小例子,附上\u003Ca href=\&http:\u002F\\u002F?target=https%3A\\u002FZhouChengChengFsoufangwang\& class=\& wrap external\& target=\&_blank\& rel=\&nofollow noreferrer\&\u003E源代码\u003Ci class=\&icon-external\&\u003E\u003C\u002Fi\u003E\u003C\u002Fa\u003E。\u003C\u002Fli\u003E\u003C\u002Ful\u003E&,&updated&:new Date(&T13:01:34.000Z&),&canComment&:false,&commentPermission&:&anyone&,&commentCount&:0,&collapsedCount&:0,&likeCount&:0,&state&:&published&,&isLiked&:false,&slug&:&&,&lastestTipjarors&:[],&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\\u002Fv2-258da83ebe1e73ce0f4da2_r.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&reviewers&:[],&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&爬虫&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&数据分析&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&scrapy&}],&adminClosedComment&:false,&titleImageSize&:{&width&:489,&height&:303},&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&column&:{&slug&:&zhouchengcheng&,&name&:&ZCC数据分析&},&tipjarState&:&activated&,&tipjarTagLine&:&分享知识,留住感动&,&sourceUrl&:&&,&pageCommentsCount&:0,&tipjarorCount&:0,&annotationAction&:[],&hasPublishingDraft&:false,&snapshotUrl&:&&,&publishedTime&:&T21:01:34+08:00&,&url&:&\u002Fp\u002F&,&lastestLikers&:[],&summary&:&\u003Cimg src=\&http:\u002F\\u002Fv2-dd64c724eef5c00ae7177fd_200x112.png\& data-rawwidth=\&982\& data-rawheight=\&460\& class=\&origin_image inline-img zh-lightbox-thumb\& data-original=\&http:\u002F\\u002Fv2-dd64c724eef5c00ae7177fd_r.png\&\u003E之前由于工作需要开始研究爬虫,发现使用Scrapy框架还挺好用,比写urllib方便很多,这里简单写个爬虫来记录下学习心得。目标:爬取搜房网杭州市新房信息语言:python 2.7浏览器:Firefox一. 安装Scrapy 如果没有安装Anaconda环境,安装Scrapy会非常繁琐,这…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:{&isTitleImageFullScreen&:false,&rating&:&none&,&titleImage&:&https:\u002F\\u002F50\u002Fv2-85e0801ffef211892beb850e38b21024_xl.jpg&,&links&:{&comments&:&\u002Fapi\u002Fposts\u002F2Fcomments&},&topics&:[{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&SQL优化&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&SQL&},{&url&:&https:\u002F\\u002Ftopic\u002F&,&id&:&&,&name&:&数据分析&}],&adminClosedComment&:false,&href&:&\u002Fapi\u002Fposts\u002F&,&excerptTitle&:&&,&author&:{&bio&:&愤怒的打工者&,&isFollowing&:false,&hash&:&1fc6f1dfcc87b392820c&,&uid&:16,&isOrg&:false,&slug&:&zhouchengcheng&,&isFollowed&:false,&description&:&每个人每天忙忙碌碌中要听到多少谎言&,&name&:&zccc&,&profileUrl&:&https:\u002F\\u002Fpeople\u002Fzhouchengcheng&,&avatar&:{&id&:&v2-cbd97e0a980a5a7daf1485&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false},&column&:{&slug&:&zhouchengcheng&,&name&:&ZCC数据分析&},&content&:&\u003Cul\u003E\u003Cli\u003ESELECT语句执行顺序\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E
第一步:执行FROM子句,如果有JOIN一并执行。\u003C\u002Fp\u003E\u003Cp\u003E
第二步:执行WHERE子句。\u003C\u002Fp\u003E\u003Cp\u003E
第三步:执行GROUP BY子句。\u003C\u002Fp\u003E\u003Cp\u003E
第四步:执行HAVING子句。\u003C\u002Fp\u003E\u003Cp\u003E
第五步:执行SELECT,处理SELECT子句提到的元素。\u003C\u002Fp\u003E\u003Cp\u003E
第六步:执行ORDER BY子句。\u003C\u002Fp\u003E\u003Cp\u003E
第七步:执行LIMIT [ OFFSET ]子句。\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E单引号表示输出常数字段\u003C\u002Fli\u003E\u003Cli\u003EORDER BY 需要把所有符合条件的数据全部加载至内存然后进行排序,再 显示输出,在数据量过大的情况下,性能下降的非常快。\u003C\u002Fli\u003E\u003Cli\u003E执行WHERE子句时,数据库进行了逐条扫描数据,符合条件返回True, 不符合返回False,返回True。\u003C\u002Fli\u003E\u003Cli\u003E谓词为返回值是布尔值的函数,例如:LIKE,BETWEEN,EXISTS等。\u003C\u002Fli\u003E\u003Cli\u003EAND优先级大于OR\u003C\u002Fli\u003E\u003Cli\u003EEXISTS返回任何非空字段都为TRUE。\u003C\u002Fli\u003E\u003Cli\u003E数据库执行计划对查询性能有很大对影响,使用EXPAIN函数可查看执行计划。\u003C\u002Fli\u003E\u003Cli\u003E执行计划运算类型:\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E
1.Seq Scan 扫描表\u003C\u002Fp\u003E\u003Cp\u003E
2.Nested Loop 循环结合,可以适用于任何连接条件,效率低\u003C\u002Fp\u003E\u003Cp\u003E
3.Hash join 等值连接 ,效率高\u003C\u002Fp\u003E\u003Cp\u003E
4.Merge join 等值或非等值条件,非等值条件下Merge join比Hash join更有效。\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E每个执行计划返回的参数:\u003C\u002Fli\u003E\u003C\u002Ful\u003E\u003Cp\u003E
1.Widths 查询结果所有字段的总宽度。\u003C\u002Fp\u003E\u003Cp\u003E
2.Rows 预测的行数。\u003C\u002Fp\u003E\u003Cp\u003E
3.Cost 预估的时间成本,包含启动时间和总时间\u003C\u002Fp\u003E\u003Cp\u003E
4.Loops 循环的次数,尽可能避免多次loops\u003C\u002Fp\u003E\u003Cul\u003E\u003Cli\u003E最先被扫描的表为驱动表,根据执行计划判断,驱动表表结构越小越好。\u003C\u002Fli\u003E\u003Cli\u003E驱动表的条件建议写在where里,附属表设置条件写在on上。\u003C\u002Fli\u003E\u003Cli\u003E表连接顺序带来耗时的变化,通过观察每种写法的cost。通常大表join小表慢,小表join大表快,优化执行计划的结果是使返回每个节点rows,loops越小越好,整体的cost越小越好。\u003C\u002Fli\u003E\u003Cli\u003Ewhere 子句使用非等于性能会下降,同时避免在where子句中使用函数。\u003C\u002Fli\u003E\u003Cli\u003Eunion all 效率高于 or,in 的效率高于or 的效率,建议使用exists 代替 in ,连续型字段多用between and ,数值型数据执行效率比字符型高,like比regexp快很多。\u003C\u002Fli\u003E\u003C\u002Ful\u003E&,&state&:&published&,&sourceUrl&:&&,&pageCommentsCount&:0,&canComment&:false,&snapshotUrl&:&&,&slug&:,&publishedTime&:&T19:16:53+08:00&,&url&:&\u002Fp\u002F&,&title&:&SQL笔记&,&summary&:&SELECT语句执行顺序 第一步:执行FROM子句,如果有JOIN一并执行。 第二步:执行WHERE子句。 第三步:执行GROUP BY子句。 第四步:执行HAVING子句。 第五步:执行SELECT,处理SELECT子句提到的元素。 第六步:执行ORDER BY子句。 第七步:执行LIMIT [ OFFSET…&,&reviewingCommentsCount&:0,&meta&:{&previous&:null,&next&:null},&commentPermission&:&anyone&,&commentsCount&:0,&likesCount&:0}},&annotationDetail&:null,&commentsCount&:0,&likesCount&:0,&FULLINFO&:true}},&User&:{&zhouchengcheng&:{&isFollowed&:false,&name&:&zccc&,&headline&:&每个人每天忙忙碌碌中要听到多少谎言&,&avatarUrl&:&https:\u002F\\u002Fv2-cbd97e0a980a5a7daf1485_s.jpg&,&isFollowing&:false,&type&:&people&,&slug&:&zhouchengcheng&,&bio&:&愤怒的打工者&,&hash&:&1fc6f1dfcc87b392820c&,&uid&:16,&isOrg&:false,&description&:&每个人每天忙忙碌碌中要听到多少谎言&,&badge&:{&identity&:null,&bestAnswerer&:null},&profileUrl&:&https:\u002F\\u002Fpeople\u002Fzhouchengcheng&,&avatar&:{&id&:&v2-cbd97e0a980a5a7daf1485&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&},&isOrgWhiteList&:false,&isBanned&:false}},&Comment&:{},&favlists&:{}},&me&:{},&global&:{&experimentFeatures&:{&ge3&:&ge3_9&,&ge2&:&ge2_1&,&nwebStickySidebar&:&sticky&,&newMore&:&new&,&liveReviewBuyBar&:&live_review_buy_bar_2&,&liveStore&:&ls_a2_b2_c1_f2&,&isOffice&:&false&,&homeUi2&:&default&,&answerRelatedReadings&:&qa_recommend_with_ads_and_article&,&remixOneKeyPlayButton&:&headerButton&,&asdfadsf&:&asdfad&,&qrcodeLogin&:&qrcode&,&newBuyBar&:&livenewbuy3&,&isShowUnicomFreeEntry&:&unicom_free_entry_off&,&newMobileColumnAppheader&:&new_header&,&zcmLighting&:&zcm&,&favAct&:&default&,&appStoreRateDialog&:&close&,&mobileQaPageProxyHeifetz&:&m_qa_page_nweb&,&iOSNewestVersion&:&4.2.0&,&default&:&None&,&wechatShareModal&:&wechat_share_modal_show&,&qaStickySidebar&:&sticky_sidebar&,&androidProfilePanel&:&panel_b&,&nwebWriteAnswer&:&experiment&}},&columns&:{&next&:{},&zhouchengcheng&:{&following&:false,&canManage&:false,&href&:&\u002Fapi\u002Fcolumns\u002Fzhouchengcheng&,&name&:&ZCC数据分析&,&creator&:{&slug&:&zhouchengcheng&},&url&:&\u002Fzhouchengcheng&,&slug&:&zhouchengcheng&,&avatar&:{&id&:&v2-1e49afed1b6fc41af87506d&,&template&:&https:\u002F\\u002F{id}_{size}.jpg&}}},&columnPosts&:{},&columnSettings&:{&colomnAuthor&:[],&uploadAvatarDetails&:&&,&contributeRequests&:[],&contributeRequestsTotalCount&:0,&inviteAuthor&:&&},&postComments&:{},&postReviewComments&:{&comments&:[],&newComments&:[],&hasMore&:true},&favlistsByUser&:{},&favlistRelations&:{},&promotions&:{},&draft&:{&titleImage&:&&,&titleImageSize&:{},&isTitleImageFullScreen&:false,&canTitleImageFullScreen&:false,&title&:&&,&titleImageUploading&:false,&error&:&&,&content&:&&,&draftLoading&:false,&globalLoading&:false,&pendingVideo&:{&resource&:null,&error&:null}},&drafts&:{&draftsList&:[],&next&:{}},&config&:{&userNotBindPhoneTipString&:{}},&recommendPosts&:{&articleRecommendations&:[],&columnRecommendations&:[]},&env&:{&edition&:{},&isAppView&:false,&appViewConfig&:{&content_padding_top&:128,&content_padding_bottom&:56,&content_padding_left&:16,&content_padding_right&:16,&title_font_size&:22,&body_font_size&:16,&is_dark_theme&:false,&can_auto_load_image&:true,&app_info&:&OS=iOS&},&isApp&:false},&message&:{&newCount&:0},&pushNotification&:{&newCount&:0}}

我要回帖

更多关于 创建sqlite数据库文件 的文章

 

随机推荐