一、创建项目
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