本期内容:基于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
命令来执行爬虫。)
爬取的博客信息如下:
我是一只有趣的兔子,感谢你的喜欢!