SQLAlchemy模块和scrapy框架

本文详细介绍了SQLAlchemy模块的数据库连接池技术,包括如何连接数据库、创建数据表及CRUD操作。接着讨论了Scrapy框架的核心组件,如引擎、爬虫、调度器、下载器、Item Pipeline和中间件,以及Scrapy项目结构、CrawlSpider类的使用。此外,还涵盖了Scrapy Shell的使用和下载器中间件的实现方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

SQLAlchemy模块

SQLAlchemy连接数据库使用数据库连接池技术,原理是在系统数据库初始化的时候,将数据库连接作为对象存储在内存中,当用户需要访问数据库时,并非建立一个新的连接,而是从连接池中取出一个已建立的空闲连接对象。使用完毕后,用户也并非将连接关闭,而是将连接放回连接池中,以供下一个请求访问使用。而连接的建立、断开都由连接池自身来管理。同时,还可以通过设置连接池的参数来控制连接池中的初始连接数、连接的上下限数以及每连接的最大使用次数、最大空闲时间等。

SQLAlchemy操作数据库

1.连接数据库

engine=create_engine("mysql+pymysql://root:****@localhost:3306/pymysql_demo?
charset=utf8", pool_size=5, max_overflow=4, pool_recycle=7200, pool_timeout=30)

mysql指明数据库系统类型,pymysql是连接数据库接口的模块,root是数据库系统用户名,是数据库系统密码,
localhost:3306是本地的数据库系统和数据库端口,
pymysql_demo是数据库名称
echo=True显示执行SQL语句情况
pool_size:用于设置连接数,默认设置5个
max_overflow:默认连接数为10。当超出最大连接数后,如果超出的连接数在max_overflow设置的访问内,超出部分可以继续连接访问,
在使用过后,这部分连接不放在pool(连接池)中,而是被真正关闭
pool_recycle: 连接重置周期,默认为-1,推荐设置为7200,即如果连接已空闲7200秒,就自动重新获取,防止connection被关闭
pool_timeout: 连接超时时间,默认为30秒,超过时间的连接会连接失败
?charset=utf8: 对数据库进行编码设置,能对数据库进行中文读写
?charset为编码格式,utf-8要写成utf8
2.创建数据表

# 创建映射数据库表类,列名对应数据库列名
# 字段,属性
class table1(Base):
    # 指定表名
    __tablename__ = 'table1'
    id = Column(INTEGER, primary_key=True)
    name = Column(String(50))
    age = Column(INTEGER)
# 在数据库中创建数据表
Base.metadata.create_all(engine)

3.添加操作

Base = declarative_base()
# 引入sessionmaker模块,指明绑定已连接的engin对象,生成会话对象session,该对象用于数据库的增删改查
# 可以把 sessionmaker 想象成一个手机,engine 当做 MySQL 的号码,
# 拨通这个“号码”我们就创建了一个 Session 类,下面就可以通过这个类的实例与 MySQL 愉快的交谈了!
DBsession = sessionmaker(bind=engine)
session = DBsession()
# 添加数据,新建对象,传入数据
new_data1 = table1(id=9, name='sd', age=10)
# 将新建对象加入数据库,调用 session.add() 添加一个,或者 session.add_all() 一次添加多个,以列表形式添加
session.add(new_data)

4.删除操作

session.query(table1).filter_by(id=10).delete()

5.更新操作

# 更新数据,先查询表id为8的数据,然后update对这条数据进行更新,update数据的格式是字典类型
# filter_by相当于SQL语句里的where条件, 不能填> < 号print(session.query(table1).filter_by(id=8).update({table1.age: 11}))
# 使用filter判断条件较为灵活
print(session.query(table1).filter(table1.id > 8).update({table1.age: 11}))
# 提交事务,增删改才需要执行这条命令
session.commit()

# 关闭会话,不是必要的,但最好加上
session.close()

6.查询操作

# 查询所有数据
get_data = session.query(table1).all()
print(type(get_data))  # list
for i in get_data:
    print('名字:' + i.name)
    print('年龄:%d' % i.age)
# 查询某一字段select name from table1
get_data = session.query(table1.name).all()
for i in get_data:
    print('名字:'+i.name)
# 根据条件查询某条数据
# 方法1:
get_data = session.query(table1).filter(table1.id == 2).all()
# 方法2:
get_data = session.query(table1).filter_by(id=20).all()
if get_data == []:
    print('=')
print('数据类型是:' + str(type(get_data))) 返回值为一个列表
for i in get_data:
    print('名字:'+i.name)
print('年龄:'+i.age)
# 多条件筛选select * from table1 where id>1 and age >5
get_data = session.query(table1).filter(table1.id > 1, table1.age > 5).all()
print(type(get_data))
for i in get_data:
    print('名字:'+i.name)
    print('年龄:%d'%i.age)

scrapy框架

写一个爬虫,需要做很多的事情。比如:发送网络请求、数据解析、数据存储、反反爬虫机制(更换ip代理、设置请求头等)、异步请求等。这些工作如果每次都要自己从零开始写的话,比较浪费时间。因此Scrapy把一些基础的东西封装好了,在他上面写爬虫可以变的更加的高效(爬取效率和开发效率)。因此真正在公司里,一些上了量的爬虫,都是使用Scrapy框架来解决。
scrapy框架模块功能:
Scrapy Engine(引擎):Scrapy框架的核心部分。负责在Spider和ItemPipeline、Downloader、Scheduler中间通信、传递数据等。
Spider(爬虫):发送需要爬取的链接给引擎,最后引擎把其他模块请求回来的数据再发送给爬虫,爬虫就去解析想要的数据。这个部分是我们开发者自己写的,因为要爬取哪些链接,页面中的哪些数据是我们需要的,都是由程序员自己决定。
Scheduler(调度器):负责接收引擎发送过来的请求,并按照一定的方式进行排列和整理,负责调度请求的顺序等。
Downloader(下载器):负责接收引擎传过来的下载请求,然后去网络上下载对应的数据再交还给引擎。
Item Pipeline(管道):负责将Spider(爬虫)传递过来的数据进行保存。具体保存在哪里,应该看开发者自己的需求。
Downloader Middlewares(下载中间件):可以扩展下载器和引擎之间通信功能的中间件。
Spider Middlewares(Spider中间件):可以扩展引擎和爬虫之间通信功能的中间件。

scrapy项目结构

1.创建项目
要使用Scrapy框架创建项目,需要通过命令来创建。首先进入到你想把这个项目存放的目录。然后使用以下命令创建:
scrapy startproject [项目名称]

2.目录结构
items.py:用来存放爬虫爬取下来数据的模型。
middlewares.py:用来存放各种中间件的文件。
pipelines.py:用来将items的模型存储到本地磁盘中。
settings.py:本爬虫的一些配置信息(比如请求头、多久发送一次请求、ip代理池等)。
scrapy.cfg:项目的配置文件。
spiders包:以后所有的爬虫,都是存放到这个里面。

3.使用命令创建爬虫
scrapy gensipder qsbk “qiushibaike.com
创建了一个名字叫做qsbk的爬虫,并且能爬取的网页只会限制在qiushibaike.com这个域名下。
代码如下:

import scrapy
class QsbkSpider(scrapy.Spider):
    name = 'qsbk'
    allowed_domains = ['qiushibaike.com']
    start_urls = ['http://qiushibaike.com/']

    def parse(self, response):
        pass

name:这个爬虫的名字,名字必须是唯一的。
allow_domains:允许的域名。爬虫只会爬取这个域名下的网页,其他不是这个域名下的网页会被自动忽略。
start_urls:爬虫从这个变量中的url开始。
parse:引擎会把下载器下载回来的数据扔给爬虫解析,爬虫再把数据传给这个parse方法。这个是个固定的写法。这个方法的作用有两个,第一个是提取想要的数据。第二个是生成下一个请求的url。
4.settings
在做一个爬虫之前,一定要记得修改setttings.py中的设置。两个地方是强烈建议设置的:
ROBOTSTXT_OBEY设置为False。默认是True。即遵守机器协议,那么在爬虫的时候,scrapy首先去找robots.txt文件,如果没有找到。则直接停止爬取。
DEFAULT_REQUEST_HEADERS添加User-Agent。这个也是告诉服务器,我这个请求是一个正常的请求,不是一个爬虫。
5.运行scrapy项目
运行scrapy项目。需要在终端,进入项目所在的路径,然后scrapy crawl [爬虫名字]即可运行指定的爬虫。如果不想每次都在命令行中运行,那么可以把这个命令写在一个文件中。以后就在pycharm中执行运行这个文件就可以了。比如现在新创建一个文件叫做start.py,然后在这个文件中填入以下代码:

from scrapy import cmdline
cmdline.execute("scrapy crawl qsbk".split())

CrawlSpider类

CrawlSpider继承自父类Spider,拥有父类Spider的全部属性,并有自身的独特属性
1)rules:是Rule对象的集合,用于匹配目标网站并排除干扰
2)parse_start_url用于爬取起始响应,必须要返回Item,Request其中之一
1.创建CrawlSpider爬虫
通过以下命令创建:
scrapy genspider -t crawl [爬虫名字] [域名]
2.LinkExtractors链接提取器
使用LinkExtractors可以自动提取想要的url,然后发送请求。这些工作都可以交给LinkExtractors,他会在所有爬的页面中找到满足规则的url,实现自动的爬取。以下对LinkExtractors类做一个简单的介绍:

class scrapy.linkextractors.LinkExtractor(
    allow = (),
    deny = (),
    allow_domains = (),
    deny_domains = (),
    deny_extensions = None,
    restrict_xpaths = (),
    tags = ('a','area'),
    attrs = ('href'),
    canonicalize = True,
    unique = True,
    process_value = None
)

主要参数讲解:
allow:允许的url。所有满足这个正则表达式的url都会被提取。
deny:禁止的url。所有满足这个正则表达式的url都不会被提取。
allow_domains:允许的域名。只有在这个里面指定的域名的url才会被提取。
deny_domains:禁止的域名。所有在这个里面指定的域名的url都不会被提取。
restrict_xpaths:严格的xpath。和allow共同过滤链接。
3.Rule规则类
定义爬虫的规则类。以下对这个类做一个简单的介绍:

class scrapy.spiders.Rule(
    link_extractor, 
    callback = None, 
    cb_kwargs = None, 
    follow = None, 
    process_links = None, 
    process_request = None
)

主要参数讲解:
link_extractor:一个LinkExtractor对象,用于定义爬取规则。
callback:满足这个规则的url,应该要执行哪个回调函数。因为CrawlSpider使用了parse作为回调函数,因此不要覆盖parse作为回调函数自己的回调函数。
follow:指定根据该规则从response中提取的链接是否需要跟进。
process_links:从link_extractor中获取到链接后会传递给这个函数,用来过滤不需要爬取的链接。

Scrapy Shell

想要在爬虫中使用xpath、beautifulsoup、正则表达式、css选择器等来提取想要的数据。但是因为scrapy是一个比较重的框架。每次运行起来都要等待一段时间。因此要去验证我们写的提取规则是否正确,是一个比较麻烦的事情。因此Scrapy提供了一个shell,用来方便的测试规则。当然也不仅仅局限于这一个功能。
打开Scrapy Shell:
打开cmd终端,进入到Scrapy项目所在的目录,然后进入到scrapy框架所在的虚拟环境中,输入命令scrapy shell [链接]。就会进入到scrapy的shell环境中。在这个环境中,可以跟在爬虫的parse方法中一样使用了。

下载器中间件

下载器中间件是引擎和下载器之间通信的中间件,在这个中间件中可以设置代理、更换请求头等来达到反反爬虫的目的。要写下载器中间件,可以在下载器中实现两个方法。一个是process_request(self, request, spider),这个方法是在请求发送之前会执行,还有一个process_responser(self, request, spider),这个方法是数据下载到引擎之前执行的
process_request(self, request, spider):
这个方法是下载器在发送请求之前会执行的。一般可以在这个里面设置随机代理ip等。
1.参数
request:发送请求的request对象。
spider:发送请求的spider对象。
2.返回值
返回None:如果返回None,Scrapy将继续处理该request,执行其他中间件中的相应方法,知道合适的下载器处理函数被调用。
返回Response对象:Scrapy将不会调用任何其他的process_request方法,将直接返回这个response对象。已经激活的中间件的process_response()方法则会在每个response对象返回时被调用
返回Request对象:不再使用之前的request对象去下载数据,而是根据现在返回的request对象返回数据。
如果这个方法中抛出了异常,则会调用process_exception方法
process_response(self, request, response, spider)
这个是下载器下载的数据到引擎中会执行的方法。
1.参数
request:request对象
response:被处理的response对象
spider:spider对象
2.返回值:
返回Response对象:会将这个新的response对象传给其他中间件,最终传给爬虫
返回Request对象:下载器链被切断,返回的request会重新被下载器调度下载
如果抛出一个异常,那么调用request的errback方法,如果没指定这个方法,那么会抛出一个异常

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值