前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >爬虫篇|学会如何入库(六)

爬虫篇|学会如何入库(六)

作者头像
润森
发布2019-08-29 11:09:35
9770
发布2019-08-29 11:09:35
举报
文章被收录于专栏:毛利学Python毛利学Python

什么是数据库

数据库,简而言之可视为电子化的文件柜——存储电子文件的处所,用户可以对文件中的数据进行新增、查询、更新、删除等操作。

Python DB-API使用流程:

  • 引入 API 模块。
  • 获取与数据库的连接。
  • 执行SQL语句和存储过程。
  • 关闭数据库连接。
常见的数据库应该是mysql ,mongodb,redis

大家首先安装好mysql,mongodb,redis

MySQL与Python的交互

在使用 PyMySQL 之前,我们需要确保 PyMySQL 已安装

$ pip3 install PyMySQL (打开cmd pip 安装) 现在我们开始来学习一下怎么连接操作mysql。

首先我们需要导入pymysql的模块,import pymysql。然后调用pymysql.connect()连接数据库。调用connect发回的游标connection.cursor(),执行查询语句。接下来我们需要调用cursor.execute()来执行sql语句,connection.commit(),最后调用connection.close()方法关闭数据库连接。

代码如下:

代码语言:javascript
复制
import pymysql
# 打开数据库连接
db = pymysql.connect("localhost","testuser","test123","TESTDB" )
# 使用 cursor() 方法创建一个游标对象 cursor
cursor = db.cursor()
# 使用 execute()  方法执行 SQL 查询 
cursor.execute("SELECT VERSION()")
# 使用 fetchone() 方法获取单条数据.
data = cursor.fetchone()
print ("Database version : %s " % data)
# 关闭数据库连接
db.close()

还有简便的写法

代码语言:javascript
复制
import pymysql
db_config = {
    'user':'root',
    'password':'qwe123',
    'db':'spiders', #数据库名字
    'charset':'utf8'
    'host' : 'localhost' #虚拟机ip
}
db = pymysql.connect(**db_config)
cur = db.cursor()
#查找
cur.execute('select * from teacher_student')
# 插入
sql1 = 'insert into items(id,name,age) VALUES(%s,%s,%s)'
cur.execute(sql1,('1','毛利',18))
db.commit() #要提交
#改
sql2 = 'update items set age = %s where name = %s'
cursor.execute(sql2,(8888,'毛利'))
db.commit()
db.close()

mongodb与Python的交互

确保安装好pymongo

代码语言:javascript
复制
import pymongo
collection = pymongo.MongoClient()
db = collection['my_mongo'] 
my_col = db['student']
result = my_col.insert_one({'name':'毛利'},{'age':18})

在这里插入图片描述

redis与Python的交互

redis的库不叫pyredis,叫redis

代码语言:javascript
复制
import redis
conn = redis.StrictRedis() #就是一个StrictRedis()
result = conn.get('name')
print(result)

在这里插入图片描述

实战爬取

爬取对象(豆瓣电影top250数据抓取并入mongodb数据库)

https://movie.douban.com/top250?start=25&filter=

爬取的数据

  • 封装数据库
代码语言:javascript
复制
# 封装monongodb
import pymongo
from pymongo.collection import Collection
class Handle_Mongo(object):
    def __init__(self):
        # 虚拟机的ip是192.168.96.128
        mongo_client = pymongo.MongoClient(host="192.168.96.128",port=27017)
        # 数据库的名称
        self.db_data = mongo_client['douban']
    def handle_save_data(self,item):
        # 集合的名字
        task_collection = Collection(self.db_data,'douban_data')
        # 插入数据
        task_collection.insert(item)
douban_mongo = Handle_Mongo()

这次爬虫使用多线程的方法

代码语言:javascript
复制
import re
from concurrent.futures import ThreadPoolExecutor
import requests
from lxml import etree
from handle_mongo import douban_mongo

分析url发现start这个参数在变化,所以不断的迭代

代码语言:javascript
复制
def handle_page_url(self):
        #通过分析页面URL可以得知
        #通过range构造页码变量,从0开始,到249结束,步长为25
        for i in range(0,250,25):
            url = "https://movie.douban.com/top250?start=%s&filter="%i
            self.page_url.append(url)

不断的用xpath来解析

代码语言:javascript
复制
    def handle_page_detail(self,url):
        # print(url)
        #处理特殊字符
        sub_search = re.compile(r"[\s\r\t]")
        response = self.handle_request(url=url)
        html = etree.HTML(response)
        #解析当前页面有多少个电影信息
        item_list = html.xpath("//ol[@class='grid_view']//li")
        print(item_list)
        for item in item_list:
            info = {}
            #电影名称,将特殊字符替换为空
            info['movie_name'] = sub_search.sub('',''.join(item.xpath(".//div[@class='hd']/a//span/text()")))
            info['actors_information'] = sub_search.sub('',''.join(item.xpath(".//div[@class='bd']/p/text()")))
            info['score'] = sub_search.sub('',''.join(item.xpath(".//div[@class='bd']/div[@class='star']/span[2]/text()")))
            info['evaluate'] = sub_search.sub('',''.join(item.xpath(".//div[@class='bd']/div[@class='star']/span[4]/text()")))
            info['describe'] = sub_search.sub('',''.join(item.xpath(".//p[@class='quote']/span/text()")))
            info['from_url'] = url
            #数据入库
            # print(info)
            douban_mongo.handle_save_data(info)

开多线程爬虫

代码语言:javascript
复制
#启动方法
def run(self):
    self.handle_page_url()
    #创建线程池
    t = ThreadPoolExecutor()
    for i in self.page_url:
        t.submit(self.handle_page_detail,i)
    t.shutdown()
    print(self.page_url)

效果图

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-07-23,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小刘IT教程 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • Python DB-API使用流程:
  • MySQL与Python的交互
  • mongodb与Python的交互
  • redis与Python的交互
  • 实战爬取
相关产品与服务
云数据库 Redis
腾讯云数据库 Redis(TencentDB for Redis)是腾讯云打造的兼容 Redis 协议的缓存和存储服务。丰富的数据结构能帮助您完成不同类型的业务场景开发。支持主从热备,提供自动容灾切换、数据备份、故障迁移、实例监控、在线扩容、数据回档等全套的数据库服务。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档