爬虫思路:

先是进入到自家的博客页面http://www.cnblogs.com/fengzheng/,这是我的博客首页,以列表形式显示已经发布的博文,这是第一页,点击页面下面的下一页按钮,进入第二页,页面地址为http://www.cnblogs.com/fengzheng/default.html?page=2,由此看出网站以page作为参数来表示页数,这样看来爬虫的规则就很简单了,
fengzheng/default.html?page=([\d]+),那一个就是爬虫的平整,爬取default.html页面,page参数为数字的页面,那样无论有多少页都可以遍历到。当然,尽管页面数量很少可以在start_urls列表中,将要爬取的页面都列出来,可是如此当博文数量净增就会出现难点,如下:

start_urls = [
       "http://www.cnblogs.com/fengzheng/default.html?page=1",
       "http://www.cnblogs.com/fengzheng/default.html?page=2",
       "http://www.cnblogs.com/fengzheng/default.html?page=3",
   ]

当爬取的网页具有规则定义的场馆下,要持续CrawlSpider爬虫类,使用Spider就分外了,在规则定义(rules)时,假设要对爬取的网页进行拍卖,而不是简约的急需Url,那时,必要定义三个回调函数,在爬取到符合条件的网页时调用,并且安装follow=Ture,定义如下:

rules = (
        Rule(LinkExtractor(allow=('fengzheng/default.html\?page\=([\d]+)', ),),callback='parse_item',follow=True),
    )

回调函数名称为parse_item,在parse_item方法中,就是的确要分析网页html,获取须求的故事情节的时候了。观看页面,查看必要的新闻在怎么职位,如图:

json 1

日后,分析网页源码,分析出xpath

json 2

用如下代码找到全数的class为day的div,每多少个就是壹个博文区域:

posts = sel.xpath('//div[@id="mainContent"]/div/div[@class="day"]')

自此遍历那几个集合,获取所需内容,其中注意一下几点:

  • 因为有普通话内容,要对获取的情节开展encode(“utf-8”)编码

  • 鉴于评论数和阅读量混在一块,要对丰硕字符串再拓展正则表明式提取 

迄今,简单的爬虫已经做到,接下去要运维这些爬虫,cd进入到爬虫项目所在的目录,执行以下命令:

scrapy crawl cnblogsSpider

会输出爬取进程消息

json 3

而后会看到,根目录中多了三个item.json文件,cat此文件内容,可以看来新闻已经被提取出来:

json 4

越多入门教程可以参考 (http://www.bugingcode.com/python_start/)

制造一个二个项目

推行如下命令创立三个Scrapy项目

scrapy startproject scrapy_cnblogs

成立之后查看项目标目录结构如下:

scrapy_cnblogs
   ├── botcnblogs
   │   ├── __init__.py
   │   ├── items.py       #用于定义抓取内容的实体
   │   ├── pipelines.py   #处理抓取的item的管道
   │   ├── settings.py    #爬虫需要的配置参数在这里
   │ └── spiders
   │   └── __init__.py
   └── scrapy.cfg            #项目的配置文件,可以不去理会,默认即可

比较之下框架的裨益,来了然各类文件的用途。

里头scrapy.cfg所在的目录为品种的根目录,此文件是项目标配置文件,项目确立后,此文件的始末可以不要理会。其情节如下:

[settings]
default = botcnblogs.settings

[deploy]
#url = http://localhost:6800/
project = botcnblogs

在items.py文件里定义在抓取网页内容中架空出来的数据结构的概念,由于此地须求博客名称、发表日期、阅读量和评论量那八个字段,定义的Item结构如下:

from scrapy import Item,Field   #引入Item、Field

class BotcnblogsItem(Item):
    # define the fields for your item here like:
    title = Field()        #标题
    publishDate = Field()  #发布日期
    readCount = Field()    #阅读量
    commentCount = Field() #评论数<br><br>

在pipelines.py里对爬虫抓取到的新闻(那里的新闻是早就社团好的上面定义的Item对象)举行处理,官方介绍的一枝独秀的采取场景为:

  • 清理HTML数据

  • 表明爬取的多少(检查item蕴含有个别字段)

  • 查重(并丢弃)

  • 将爬取结果保存到数据库中

它的定义也很粗略,只需求贯彻process_item方法即可,此措施有三个参数,贰个是item,即要处理的Item对象,另三个参数是spider,即爬虫。

其它还有open_spider和close_spider三个艺术,分别是在爬虫运转和了结时的回调方法。

本例中处理很粗略,只是将采用的Item对象写到一个json文件中,在__init__json,措施中以“w+”的主意打开或创办2个item.json的文书,然后把对象反体系化为字符串,写入到item.json文件中。代码如下:

# -*- coding: utf-8 -*- 
import json

class BotcnblogsPipeline(object):
    def __init__(self):
        self.file = open("item.json", "w+")

    def process_item(self, item, spider):
        record = json.dumps(dict(item), ensure_ascii=False)+"\n"  #此处如果有中文的话,要加上ensure_ascii=False参数,否则可能出现乱码
        self.file.write(record)
        return item

    def open_spider(self, spider):
        pass

    def close_spider(self, spider):
        self.file.close()

setting.py是爬虫的布局文件,配置爬虫的一对配置新闻,那里运用的就是安装pipelines的ITEM_PIPELINES参数,此参数配置项目中启用的pipeline及其实施顺序,以字典的样式存在,{“pipeline”:执行各种整数}

此例中的配置如下:

SPIDER_MODULES = [‘botcnblogs.spiders’]
NEWSPIDER_MODULE = ‘botcnblogs.spiders’

ITEM_PIPELINES = {
‘botcnblogs.pipelines.BotcnblogsPipeline’: 1,
}

早为之所工作都办好了,爬虫呢,爬虫在哪里完毕啊,咱们看看项目中有个spiders目录,里面唯有多个init.py文件,没错,爬虫文件需求自身成立,就在那几个目录下,那里开创一个botspider.py的公文,对网页进行分析的工作就要在此处达成了,此例中定义的爬虫类继承自CrawlSpider类。

概念3个Spider须求如下多少个变量和措施完毕:

name:定义spider名字,这一个名字应该是唯一的,在实践那几个爬虫程序的时候,必要用到这些名字。

allowed_domains:允许爬取的域名列表,例如未来要爬取今日头条,那里要写成cnblogs.com

start_urls:爬虫最开首爬的进口地址列表。

rules:如若要爬取的页面不是单身一个依旧多少个页面,而是兼具一定的条条框框可循的,例如爬取的博客有一而再多页,就可以在此地安装,要是定义了rules,则需求团结定义爬虫规则(以正则表明式的艺术),而且要求自定义回调函数。

代码说话:

#-*- coding:utf-8 -*-
__author__ = 'linuxfengzheng'

from scrapy.spiders import Spider, Rule
from scrapy.selector import Selector
from botcnblogs.items import BotcnblogsItem
from scrapy.linkextractors import LinkExtractor
import re
from scrapy.spiders import CrawlSpider

class botspider(CrawlSpider):
    name = "cnblogsSpider"   #设置爬虫名称

    allowed_domains = ["cnblogs.com"]  #设置允许的域名
    start_urls = [
        "http://www.cnblogs.com/fengzheng/default.html?page=3",  #设置开始爬取页面
    ]


    rules = (
        Rule(LinkExtractor(allow=('fengzheng/default.html\?page\=([\d]+)', ),),callback='parse_item',follow=True),
    )  #制定规则


    def parse_item(self, response):
        sel = response.selector
        posts = sel.xpath('//div[@id="mainContent"]/div/div[@class="day"]')
        items = []
        for p in posts:
            #content = p.extract()
            #self.file.write(content.encode("utf-8"))
            item = BotcnblogsItem()
            publishDate = p.xpath('div[@class="dayTitle"]/a/text()').extract_first()

            item["publishDate"] = (publishDate is not None and [publishDate.encode("utf-8")] or [""])[0]
            #self.file.write(title.encode("utf-8"))
            title = p.xpath('div[@class="postTitle"]/a/text()').extract_first()
            item["title"] = (title is not None and [title.encode("utf-8")] or [""])[0]

            #re_first("posted @ 2015-11-03 10:32 风的姿态 阅读(\d+")

            readcount  = p.xpath('div[@class="postDesc"]/text()').re_first(u"阅读\(\d+\)")

            regReadCount = re.search(r"\d+", readcount)
            if regReadCount is not None:
                readcount = regReadCount.group()
            item["readCount"] = (readcount is not None and [readcount.encode("utf-8")] or [0])[0]

            commentcount  = p.xpath('div[@class="postDesc"]/text()').re_first(u"评论\(\d+\)")
            regCommentCount = re.search(r"\d+", commentcount)
            if regCommentCount is not None:
                commentcount = regCommentCount.group()
            item["commentCount"] = (commentcount is not None and [commentcount.encode("utf-8")] or [0])[0]
            items.append(item)

        return items
        #self.file.close()

题记

咱俩怎么须要贰个爬虫框架?三个爬虫框架能帮大家做哪些事情,减轻大家什么的部分行事,大家再度梳理爬虫到底是做哪些的,哪些工作是再度的做事,我们可以用框架来消除的。

二个简易的爬虫,从三个url初步,从起头的网页里面解析到拥有只怕的链接,通过这一个链接不断的递归,抓取到全网的网页。

在那一个进程中,

  • 急需考虑抓取的url重复难点,在不停增加后的网页中,只怕含有在我们曾经抓取的网页地址,而那一个地点我们是不期待她在再次抓取一遍。

  • 取得网页模块,多个好的得到网页模块,会潜移默化到这一个爬虫的成色,而这一片段可以独立出来,重复使用。

  • 抓取的网页后,须要展开对网页进行清洗,得到大家须要的音讯。

  • 取得了大家要求的音讯之后,大概必要把它保存在文书中大概是数据库中等等。

  • 稍微特定的必要,项目本人对一些网页并不感兴趣,爬虫可以拓展对爬取的链接举行过滤。

这就是scrapy 爬虫可以为大家做的作业。

安装scrapy

scrapy是第2方库,安装的时候可以是用pip,如下:

pip install scrapy

相关文章

网站地图xml地图