python爬虫框架scrapy

爬虫框架Scrapy(四)

使用框架Scrapy开发一个爬虫只需要四步:
创建项目:scrapy startproject proname(项目名字,不区分大小写)
明确目标(编写items.py):明确你想要抓取的目标
制作爬虫(spiders/xxspider.py):制作爬虫开始爬取网页
存储内容(pipelines.py):设计管道存储爬取内容,存入数据库

1、创建项目

在开始爬取之前,必须创建一个新的Scrapy项目。进入自定义的项目目录中,运行下列命令:

scrapy startproject spiderProject

生成项目scrapy_1,目录如下:

spiderProject/
   spiderProject1/
        spiders/
        __init__.py
        items.py
        middlewares.py
        pipelines.py
        settings.py
    scrapy.cfg

这些文件分别是:
scrapy.cfg: 项目的配置文件。
spiderProject/: 项目的Python模块,将会从这里引用代码。
spiderProject/items.py: 项目的目标文件。
spiderProject/pipelines.py: 项目的管道文件。
spiderProject/settings.py: 项目的设置文件。
spiderProject/spiders/: 存储爬虫代码目录。

2、明确目标

抓取豆瓣电影TOP250网站所有的电影以及评分https://movie.douban.com/top250
再项目的目标文件创建,制作一个Item容器。
Item容器是存储爬取数据的容器,使用方式类似于python字典Dict,我们需要对爬取的数据分析,定义爬取记录的数据结构,然后建立相应的字段。
在spiderProject/items.py文件添加:

import scrapy

# 爬取豆瓣电影以及评分
class SpiderprojectItem(scrapy.Item):
    name = scrapy.Field()
    score = scrapy.Field()

3、制作爬虫

3.1、创建爬虫douban

在当前目录下输入命令:

scrapy genspider douban "douban.cn"

创建一个名为douban的爬虫,将在scrapy_1/spiders目录下生成一个douban.py文件,并指定爬取域的范围。

import scrapy
class DooubanSpider(scrapy.Spider):
    name = 'doouban'
    allowed_domains = ['doouban.cn']
    start_urls = ['http://doouban.cn/']

    def parse(self, response):
        pass

3.2、确立属性方法

要实现一个Spider爬虫, 必须有一个继承scrapy.Spider类的子类,并确定了三个强制的属性 和 一个方法。

name属性

name = "" :这个爬虫的识别名称,必须是唯一的,在不同的爬虫必须定义不同的名字。

allow_domains属性

allow_domains = [] 是搜索的域名范围,也就是爬虫的约束区域,规定爬虫只爬取这个域名下的网页,不存在的URL会被忽略。

start_urls属性

start_urls = () :爬取的URL元祖/列表。爬虫从这里开始抓取数据,所以,第一次下载的数据将会从这些urls开始。其他子URL将会从这些起始URL中继承性生成。

parse方法

parse(self, response) :解析的方法,每个初始URL完成下载后将被调用,调用的时候传入从每一个URL传回的Response对象来作为唯一参数,主要作用如下:
1、负责解析返回的网页数据(response.body),提取结构化数据(生成item);
2、生成需要下一页的URL请求;

3.3、配置文件

如果执行爬虫过程中,出现403错误:

HTTP status code is not handled or not a llowed

我们需要将自身伪装成浏览器请求
修改配置文件settings.py,添加如下(添加任意一个均可以):

import random
# 需要设置USER_AGENT,假装自己是浏览器访问网页
user_agent_list = [
 "Mozilla/5.0 (Macintosh; U; Intel Mac OS X 10_6_8; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
 "Mozilla/5.0 (Windows; U; Windows NT 6.1; en-us) AppleWebKit/534.50 (KHTML, like Gecko) Version/5.1 Safari/534.50",
 "Mozilla/5.0 (Windows NT 10.0; WOW64; rv:38.0) Gecko/20100101 Firefox/38.0",
 "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; .NET4.0C; .NET4.0E; .NET CLR 2.0.50727; .NET CLR 3.0.30729; .NET CLR 3.5.30729; InfoPath.3; rv:11.0) like Gecko",
 "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0)",
 "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)",
 "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)",
 "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)",
 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10.6; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
 "Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1",
 "Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11",
 "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11",
 "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_0) AppleWebKit/535.11 (KHTML, like Gecko) Chrome/17.0.963.56 Safari/535.11"
 ]
USER_AGENT = random.choice(user_agent_list)

同时settings文件加入mongoDB的配置信息

# MONGODB 主机名
MONGODB_HOST = "127.0.0.1"
# MONGODB 端口号
MONGODB_PORT = 27017
# 数据库名称
MONGODB_DBNAME = "Douban"
# 存放数据的表名称
MONGODB_SHEETNAME = "doubanmovies"

3.4、配置爬虫文件

爬取需要的数据,形成json文件

from spiderProject.items import SpiderprojectItem

class DoubanSpider(scrapy.Spider):
    name = 'douban'
    allowed_domains = ['douban.cn']
    start_urls = ['http://movie.douban.com/top250']

    def parse(self, response):

        for item in response.css('.item'):
            movie = SpiderprojectItem()
            title = item.css('.hd span.title::text').extract_first()
            star = item.css('.star span.rating_num::text').extract_first()
            movie['name'] = title
            movie['score'] = star
            yield movie
        # 获取下一页url
        # next_url = response.css('span.next a::attr("href")').extract_first()
        # if next_url is not None:
        #     url = self.start_urls[0]+next_url
        #     yield scrapy.Request(url=url,callback=self.parse())

4、设计管道,存储数据mongoDB

# 存入mongoDB数据库
import pymongo
from spiderProject.settings import MONGODB_HOST
from spiderProject.settings import MONGODB_PORT
from spiderProject.settings import MONGODB_DBNAME
from spiderProject.settings import MONGODB_SHEETNAME

class SpiderprojectPipeline:
    def __init__(self):
        host = MONGODB_HOST
        port = MONGODB_PORT
        dbname = MONGODB_DBNAME
        tablename = MONGODB_SHEETNAME
        # 创建数据库连接
        self.client = pymongo.MongoClient(
            host=host,
            port=port
        )
        # 指定数据库
        mydb=self.client[dbname]
        # 指定数据表
        self.dbtable = mydb[tablename]

    def process_item(self, item, spider):
        # 将数据存入数据表
        data = dict[item]
        self.dbtable.insert(data)
        return item

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

同时需要在settings文件下打开管道文件配置(只需要解开注释就可以了)。

# 启用管道
# 优先级 现在是300 范围 0-1000 越小 优先级越高
ITEM_PIPELINES = {
   'spiderProject.pipelines.SpiderprojectPipeline': 300,
}

5、运行爬虫

scrapy crawl douban

6、查看存入mongoDB的数据

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,293评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,604评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,958评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,729评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,719评论 5 366
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,630评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,000评论 3 397
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,665评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,909评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,646评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,726评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,400评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,986评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,959评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 44,996评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,481评论 2 342

推荐阅读更多精彩内容