Scrapy框架入门学习

一、创建项目

1.cmd,cd到你想要存放项目的位置,执行如下命令创建项目

scrapy startproject 项目名称
# scrapy startproject test_spider

 

items.py保存爬取到的数据的容器(像是一个字典)
spider(文件夹)爬虫,负责解析response和提取Item
pipelines.py保存爬取到的数据

2.进入项目

cd 项目名称
# cd test_spider

3.创建爬虫,执行命令如下

# scrapy genspider itcast www.itcast.cn
scrapy genspider 爬虫名称 允许爬取的域 

二、执行思路

1.定义需要爬取的信息(items.py

import scrapy


class TestSpiderItem(scrapy.Item):

    name = scrapy.Field()

    img = scrapy.Field()

    level = scrapy.Field()

    content = scrapy.Field()

 2.提取信息,解析数据(itcast.py / 创建爬虫时,爬虫名称.py 在spiders文件夹下)

import scrapy
from test_spider.items import TestSpiderItem
# from pipelines.py(CLASS名).items import items.py(CLASS名)

class ItcastSpider(scrapy.Spider):
    name = 'itcast' # 爬虫名称(唯一)
    allowed_domains = ['www.itcast.cn'] # 定义允许爬取的域,若不是该列表内的域名则放弃抓取
    start_urls = ['http://www.itcast.cn/channel/teacher.shtml#ajavaee'] # spider在启动时爬取的入口url列表

    def parse(self, response):

        t_list = response.xpath('//div[@class="li_txt"]')
        for game in t_list: # 循环抓取的信息
            item = TestSpiderItem()

            name = game.xpath('./h3/text()').extract()
            img = game.xpath('./../img/@data-original').extract()
            level = game.xpath('./h4/text()').extract()
            content = game.xpath('./p/text()').extract()

            item["name"] = name
            item["img"] = img
            item["level"] = level
            item["content"] = content
 
            yield item

3.存储内容(pipelines.py

from itemadapter import ItemAdapter
import json

class TestSpiderPipeline(object):

    def open_spider(self,spider):
        # itcast.json 存放抓取到的信息的文件名
        self.file = open("itcast.json","w",encoding="utf-8")

    def process_item(self, item, spider):
        dict_item = dict(item)
        json_str = json.dumps(dict_item,ensure_ascii=False)+"\n"
        self.file.write(json_str)
        return item

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

三、启动spider

在项目根目录执行如下命令

scrapy crawl 项目名称
# scrapy crawl itcast

执行成功后,打开itcast.json文件就能看到抓取的信息啦!

四、数据库存储数据

打开数据库创建一个存储抓取信息的表

CREATE TABLE `info` (
  `name` varchar(255) DEFAULT NULL,
  `img` text,
  `level` varchar(50) DEFAULT NULL,
  `content` text
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

 修改配置文件(settings.py

ITEM_PIPELINES = {
   'test_spider.pipelines.TestSpiderPipeline': 300,
   'test_spider.pipelines.mysqlPipeline': 320,
}

LOG_LEVEL='ERROR' # 只显示指定类型的日志信息 这个不需要的可以不用加

pipelines.py

import pymysql
#新增一个类
class mysqlPipeline(object):

    def __init__(self):
        self.conn = None  # 定义一个文件描述符属性
        self.cursor = None
        self.num = 0

    def open_spider(self, spider):
        self.conn = pymysql.Connect(host='127.0.0.1',port=3306,user='数据库账号',password='数据库密码',db='数据库名',charset='utf8')
        print('---------begin-----------------')

    def process_item(self, item, spider):
        name = item['name']
        img = item['img']
        level = item['level']
        content = item['content']
        self.cursor = self.conn.cursor()
        try:
            self.cursor.execute('insert into info values(%s,%s,%s,%s)' ,(name,img,level,content))
            self.conn.commit()
        except Exception as e:
            print(e)
            print('---------error-----------------')
            self.conn.rollback()
        return item

    def close_spider(self, spider):
        print('---------end-----------------')
        self.cursor.close()
        self.conn.close()

问题:

1.pymysql model找不到报错就是没有安装pymysql,执行以下命令安装就可以了

pip install pymysql

2.插入数据时返回1136 Column count doesn't match value count at row 1

       这个是因为你插入的字段数量与表中字段数量不统一导致的。比如我一开始建的表有一个自增的id主键,插入数据时就会报错,所以我把这个字段直接去掉了hhhhh

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值