本期内容:基于scrapy+mysql爬取博客信息并保存到数据库中
实验需求
项目下载地址:https://download.csdn.net/download/m0_68111267/88740730
本次实验实现了:使用Scrapy框架爬取博客专栏的目录信息并保存到MySQL数据库中,实验主要涉及到Python的爬虫技术以及MySQL的基本操作,需要有一定的基础。
本次实验需要安装scrapy库,如果没有scrapy库的话可以运行下面的命令进行安装哦~
pip install -i https://pypi.tuna.tsinghua.edu.cn/simple scrapy
scrapy startproject myblog
scrapy genspider sp_blogs "https://want595.blog.csdn.net/category_12039968_1.html"
该命令将使用Scrapy生成一个名为"sp_blogs"的爬虫,并将爬虫的起始URL设置为"https://want595.blog.csdn.net/category_12039968_1.html"。(本次实验需要爬取的就是这个专栏的目录)
输入完这个命令后,在spiders的目录下就会出现"sp_blogs.py"这个文件啦~
打开"settings.py"文件,配置系统设置:
"pipelines.py"文件,主要用于编写代码处理爬取的数据,例如存放到文件中,数据库中等等
# Define your item pipelines here # # Don't forget to add your pipeline to the ITEM_PIPELINES setting # See: https://docs.scrapy.org/en/latest/topics/item-pipeline.html # useful for handling different item types with a single interface import pymysql from twisted.enterprise import adbapi class MyblogPipeline: def __init__(self, dbpool): self.dbpool = dbpool @classmethod def from_settings(cls, settings): dbparams = dict( host=settings['MYSQL_HOST'], # 读取settings中的配置 db=settings['MYSQL_DBNAME'], user=settings['MYSQL_USER'], passwd=settings['MYSQL_PASSWD'], charset='utf8', # 编码要加上,否则可能出现中文乱码问题 cursorclass=pymysql.cursors.DictCursor, use_unicode=False, ) dbpool = adbapi.ConnectionPool('pymysql', **dbparams) # **表示将字典扩展为关键字参数,相当于host=xxx,db=yyy.... return cls(dbpool) # 相当于dbpool付给了这个类,self中可以得到 # pipeline默认调用 def process_item(self, item, spider): query = self.dbpool.runInteraction(self.insert, item) # 调用插入的方法 query.addErrback(self.error, item, spider) # 调用异常处理方法 return item # 写入数据库中 def insert(self, db, item): # print item['name'] sql = "insert ignore into blogs(title,url) values(%s,%s)" params = (item["name"], item["url"]) db.execute(sql, params) # 错误处理方法 def error(self, failue, item, spider): print(failue)
该代码是一个Twisted框架下的MySQL数据库存储的Pipeline。Twisted是一个事件驱动的网络框架,使用异步的方式处理网络请求。
该代码中的MyblogPipeline类继承自object类,并且实现了__init__、from_settings、process_item、insert和error方法。
__init__方法初始化了一个数据库连接池dbpool,并将其赋值给self.dbpool。
from_settings方法从配置文件中读取数据库的相关配置信息,并利用这些信息创建一个数据库连接池dbpool。
process_item方法是Pipeline默认调用的方法,用于处理item并存储到数据库中。在该方法中,首先调用self.dbpool.runInteraction()方法创建一个操作数据库的事务,并调用self.insert方法将item插入到数据库中。然后,通过addErrback方法添加了一个异常处理方法self.error。
insert方法接收两个参数,一个是数据库连接对象db,一个是item。在该方法中,定义了一个SQL语句和参数,并通过db.execute()方法执行了数据库插入操作。
error方法用于处理插入数据库时的异常情况,将异常信息打印出来。
总体而言,该代码实现了将爬取的数据存储到MySQL数据库中的功能。
新建一个"db.py"文件,输入以下代码连接到本地数据库,运行后创建一个表,用于保存等会爬取的数据。
import pymysql from scrapy.utils.project import get_project_settings # 导入seetings配置 class DBHelper: def __init__(self): self.settings = get_project_settings() # 获取settings配置,设置需要的信息 self.host = self.settings['MYSQL_HOST'] self.port = self.settings['MYSQL_PORT'] self.user = self.settings['MYSQL_USER'] self.passwd = self.settings['MYSQL_PASSWD'] self.db = self.settings['MYSQL_DBNAME'] # 连接到具体的数据库(settings中设置的MYSQL_DBNAME) def connectDatabase(self): conn = pymysql.connect(host=self.host, port=self.port, user=self.user, passwd=self.passwd, db=self.db, charset='utf8') # 要指定编码,否则中文可能乱码 return conn # 创建表 def createTable(self, sql): conn = self.connectDatabase() cur = conn.cursor() try: cur.execute(sql) cur.close() conn.close() print("创建表成功!") except: print("创建表失败!") pass # 插入数据 def insert(self, sql, *params): # 注意这里params要加*,因为传递过来的是元组,*表示参数个数不定 conn = self.connectDatabase() cur = conn.cursor(); cur.execute(sql, params) conn.commit() # 注意要commit cur.close() conn.close() if __name__ == "__main__": dbHelper = DBHelper() sql = "create table pictures(id int primary key auto_increment,name varchar(50) unique,url varchar(200))" dbHelper.createTable(sql)
这段代码是一个用于操作MySQL数据库的助手类。它使用了Scrapy框架的get_project_settings函数来获取配置信息,然后根据配置信息连接到数据库。
在初始化方法中,它获取到了MySQL数据库的主机地址、端口号、用户名、密码和数据库名,并保存在实例变量中。
connectDatabase方法用于连接到具体的数据库,并返回一个数据库连接对象。
createTable方法用于创建表,它接受一个SQL语句作为参数,使用数据库连接对象执行SQL语句来创建表。
insert方法用于插入数据,它接受一个SQL语句和参数作为参数,使用数据库连接对象执行SQL语句来插入数据。
最后在主函数中,创建了一个DBHelper对象,并调用createTable方法来创建一个名为pictures的表。
本实验要爬取的是博客专栏的目录信息:
编写"spiders"目录下的"sp_blogs.py"文件,实现博客信息的爬取:
import scrapy from scrapy import Selector, cmdline class MyblogItem(scrapy.Item): name = scrapy.Field() url = scrapy.Field() class SpBlogsSpider(scrapy.Spider): name = "sp_blogs" allowed_domains = ["want595.blog.csdn.net"] ……请下载后查看完整代码哦
这段代码是一个基于Scrapy框架的爬虫,用于爬取一个博客网站的文章标题和链接。
首先定义了一个MyblogItem类,它继承自scrapy.Item,并定义了两个字段name和url,用于保存文章的标题和链接。
然后定义了一个SpBlogsSpider类,它继承自scrapy.Spider,表示一个具体的爬虫。在SpBlogsSpider类中,指定了爬虫的名字为sp_blogs,指定了允许爬取的域名为want595.blog.csdn.net,并指定了要爬取的起始URL。起始URL使用了一个循环生成器,生成了多个URL,用于爬取多页的数据。
parse方法是默认的回调方法,在爬取网页的响应返回后自动被调用。在parse方法中,使用Selector对象对响应进行了解析,提取出了文章的标题和链接,并将它们保存到MyblogItem对象中,然后通过yield返回给引擎。
最后,通过调用cmdline.execute函数来执行爬虫。执行时会根据给定的参数调用对应的爬虫。在这里,使用'scrapy crawl sp_blogs'参数来执行sp_blogs爬虫。(也可以在终端项目的根目录下运行scrapy crawl sp_blogs命令来执行爬虫。)
爬取的博客信息如下:
我是一只有趣的兔子,感谢你的喜欢!