参考资料:
我的测试:
-
新建项目
目标文件夹下命令行执行:
scrapy startproject 项目名称
-
项目目录结构
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
网友评论