1、使用pip install scrapy 安装scrapy
2、打开cmd命令行窗口,创建属于自己的爬虫项目工程。命令:scrapy startproject First
3、通过步骤2爬虫工程已经创建完毕,使用pycharm打开,其目录结构如下:
4、其中spiders文件夹专门用来存放爬虫的文件,items.py用来存储爬虫的数据,middlewares.py用来处理爬虫前的请求和响应,pipelines.py在存储数据前,数据会一次通过管道,进行处理,settings全局爬虫的配置文件,在其中加入数据库的配置信息,scrapy.sfg用于部署爬虫项目到服务器中。
5、再次打开cmd,进入刚才创建的项目spiders底下,输入命令:scrapy genspider jobbole blog.jobbole.com,爬虫文件创建
成功。
6、在方法parase中定义自己的页面解析方式。(css选择器、xpath方式、正则表达式等等都会用在里面)
7、在item.py中定义需要存储一些什么数据,然后在爬虫文件jobbole.py中创建该类的实例对象:jobstart = JoboStartItem()
然后把解析出的数据一一对应保存,数据名在将来会与数据库中建表时的列名保持一致
8、这样数据就可以进一步的进入到管道pipeline中进行在处理了,当然保存至mysql数据库,也是在pipeline.py这个文件中完成的。说到将数据保存到数据库就必须谈谈数据的同步保存和异步保存。一般来说数据的入库时间是要远大于爬虫解析网页获取数据的,这就导致,当数据量很大时,数据入库的速度赶不上爬虫爬下来的数据,在同步保存的情况下这就会造成阻塞,导致代码异常报错,而以异常的方式则不会出现这个问题。下面分别介绍在pipeline.py文件中编写这两种处理方式:
同步pipeline:
class MysqlPipeline(object):
def __init__(self):
self.conn = MySQLdb.connect('localhost','root','123456','article',charset="utf8", use_unicode=True)
self.cursor = self.conn.cursor()
def process_item(self, item, spider):
insert_sql = """
insert into info(date,title,url,url_object_id,front_image_url,front_image_path,praise,collect,comment)
values (%s,%s,%s,%s,%s,%s,%s,%s,%s)
"""
self.cursor.execute(insert_sql, (item["date"],item["title"],item["url"],item["url_object_id"],
item["front_image_url"],item["front_image_path"],item["praise"],
item["collect"],item["comment"]))
self.conn.commit()
异步pipeline:
class MysqlTwistedPipepline(object):
def __init__(self, dbpool):
self.dbpool = dbpool
@classmethod
def from_settings(cls, settings):
param = dict(
host = settings["MYSQL_HOST"],
db = settings["MYSQL_DBNAME"],
user = settings["MYSQL_USER"],
password = settings["MYSQL_PASSWORD"],
charset = "utf8",
cursorclass = MySQLdb.cursors.DictCursor,
use_unicode = True
)
dbpool = adbapi.ConnectionPool("MySQLdb",**param)
return cls(dbpool)
def process_item(self, item, spider):
#使用twisted将mysql插入异步化
query = self.dbpool.runInteraction(self.do_insert,item)
query.addErrback(self.handle_error) #处理异常
def handle_error(self, failure):
#处理异步插入错误
print(failure)
def do_insert(self, cursor, item):
insert_sql = """
insert into info(date,title,url,url_object_id,front_image_url,front_image_path,praise,collect,comment)
values (%s,%s,%s,%s,%s,%s,%s,%s,%s)
"""
cursor.execute(insert_sql, (item["date"],item["title"],item["url"],item["url_object_id"],
item["front_image_url"],item["front_image_path"],item["praise"],
item["collect"],item["comment"]))
9、写完pipeline后在settings.py进行配置,以上两种方式选择其中的一种即可:
10、RUN:main之后,数据依次入库: