Scrapy入门

2018-07-16  本文已影响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)

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

scrapy list

启动爬虫

scrapy crawl 爬虫名称

过程解析

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

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

上面编写的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
上一篇下一篇

猜你喜欢

热点阅读