Scrapy入门

参考资料:

scrapy参考文档

我的测试:

  • 新建项目

目标文件夹下命令行执行:

scrapy startproject 项目名称

  • 项目目录结构
图片.png

scrapy.cfg:项目配置文件
myScrapyProject:
myScrapyProject/items.py:自定义项目类的地方,也就是爬虫获取到数据之后,传入管道文件pipelines.py的载体
myScrapyProject/pipelines.py:项目管道文件,对传入的项目类中的数据进行一个清理和入库
myScrapyProject/middlewares.py:中间件配置文件
myScrapyProject/settings.py:项目的设置文件,例如下载延迟,项目管道文件中类的启用以及自定义中间件的启用和顺序
spiders:是我们爬虫文件集合,在这里新建爬虫文件

  • 新建爬虫

在spiders下新建一个Python文件,用于编写爬虫

# coding:utf-8
import scrapy

# 爬虫类,继承自scrapy.Spider类
class PrizeSpider(scrapy.Spider):
    # 爬虫名称
    name = "prize"
    # 目标网址,爬虫启动后自动爬取得链接,列表内可以放多个链接
    start_urls = ['http://www.cgscgs.org.cn/drupal/?q=node/95']

    # 爬虫启动时,爬取链接成功后自动回调的函数,默认parse,参数self和response
    def parse(self, response):
        print(response)
        # extract():序列化该节点为unicode字符串并返回list;extract_first()则是去第一个元素
        title_list = response.xpath("//*[@id='node-95']/div[1]/dl/dt/a/text()").extract()
        content_list = response.xpath("//*[@id='node-95']/div[1]/dl/dd/text()").extract()
        for i, j in zip(title_list, content_list):
            print(i, ":", j)
  • 打开PyCharm命令行

查看爬虫列表,罗列所有爬虫的名称

scrapy list

启动爬虫

scrapy crawl 爬虫名称

过程解析

Scrapy为Spider的 start_urls 属性中的每个URL创建了 scrapy.Request对象,并将 parse 方法作为回调函数(callback)赋值给了Request。

Request对象经过调度,执行生成 scrapy.http.Response对象并送回给spider parse() 方法。parse()方法是Scrapy默认的网站爬取成功时的回调函数,所以它一定有一个response参数

  • 将数据存到MySQL中

上面编写的spider类是用来爬虫,他只负责获取数据,而录入数据则是在“管道文件”pipelines中完成
首先在settings文件中启用管道类

ITEM_PIPELINES = {
   # 'myScrapyProject.pipelines.MyscrapyprojectPipeline': 300,
   # 类名称:优先级(0-1000)
   'myScrapyProject.pipelines.MyscrapyprojectPipeline': 300,
}

编写管道类

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


class MyscrapyprojectPipeline(object):
    # 爬虫开始运行的时候运行
    def open_spider(self, spider):
        print("连接数据库")
        self.connect = pymysql.connect(
            host='127.0.0.1',
            port=3306,
            db='test',
            user='admin',
            passwd='123456',
            charset='utf8')
        self.cursor = self.connect.cursor()

    # 爬虫获取的数据并不是直接传入管道中,而是赋值到items的item中,然后item作为参数传入到该方法中
    # 最终数据可以通过管道文件写入到数据库中
    def process_item(self, item, spider):
        # print(spider.name)
        print("sql")
        insert_sql = "insert into prize(title,content) values('{}','{}')".format(item['title'], item['content'])
        print(insert_sql)
        self.cursor.execute(insert_sql)
        self.connect.commit()
        return item

    # 爬虫关闭时调用
    def spider_close(self, spider):
        self.connect.close()

编写item

class MyscrapyprojectItem(scrapy.Item):
    title = scrapy.Field()
    content = scrapy.Field()

修改爬虫文件

class PrizeSpider(scrapy.Spider):
    # 爬虫名称
    name = "prize"
    # 目标网址,爬虫启动后自动爬取得链接,列表内可以放多个链接
    start_urls = ['http://www.cgscgs.org.cn/drupal/?q=node/95']

    # 爬虫启动时,爬取链接成功后自动回调的函数,默认parse,参数self和response
    def parse(self, response):
        print(response)
        # 实例化item对象
        pr = MyscrapyprojectItem()
        title_list = response.xpath("//*[@id='node-95']/div[1]/dl/dt/a/text()").extract()
        content_list = response.xpath("//*[@id='node-95']/div[1]/dl/dd/text()").extract()
        for i, j in zip(title_list, content_list):
            # 将爬取的数据写入到item中
            pr['title'] = i
            pr['content'] = j
            # 注意这里要用yield,因为item是单个传递的
            # yield可以理解为return,将pr返回,但是下一次警戒着上次的循环继续执行
            yield pr
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 218,525评论 6 507
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 93,203评论 3 395
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 164,862评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,728评论 1 294
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,743评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,590评论 1 305
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,330评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,244评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,693评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,885评论 3 336
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,001评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,723评论 5 346
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,343评论 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,919评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,042评论 1 270
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,191评论 3 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,955评论 2 355

推荐阅读更多精彩内容