美文网首页
Scrapy入门

Scrapy入门

作者: 木头猿 | 来源:发表于2018-07-16 20:20 被阅读0次

    参考资料:

    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
    

    相关文章

      网友评论

          本文标题:Scrapy入门

          本文链接:https://www.haomeiwen.com/subject/uhnupftx.html