一个简单的爬虫加sqlalchemy ORM实例

主要思路:
1、先爬取数据到一个本地文件中
2、创建一个ORM类,并利用sqlalchemy自动建表
3、读取本地文件中的内容,遍历里面的数据创建ORM对象
4、利用sqlalchemy自动进行数据库的insert操作

import requests
import time
import json
import datetime

from sqlalchemy import create_engine, Column, String, Integer, Float, Date
from sqlalchemy.ext.declarative import declarative_base
# 用于创建一个ORM类
from sqlalchemy.orm import sessionmaker
# mysql会话工厂

engine = create_engine('mysql://username:password@ipAdress/datebaseName')
# 连接数据库
Base = declarative_base()
# 获得一个base对象,ORM类将继承这个对象

def strtodate(s: str, mode='%Y/%m/%d') -> datetime:
    # 将str转为datetime,这里要转的是2020/1/2这种
    date = datetime.datetime.strptime(s, mode)
    return date


class PMarticle(Base):
    __tablename__ = 'article'
    # 表名
    id = Column(Integer, primary_key=True, autoincrement=True)
    # 设为自增量、主键
    title = Column(String(255))
    url = Column(String(255))
    date = Column(Date)


Base.metadata.create_all(engine)
# 若不存在对应的表则自动创建

def main():
    for i in range(1, 3):  # 4194
        # 以下是一个简单的爬虫,获取结果为json,然后追加到代码文件夹下的j.txt文件中
        # time.sleep(1)
        url = "http://www.woshipm.com/__api/v1/stream-list/page/" + str(i)
        r = requests.get(url).text
        j = json.loads(r)
        with open('j.txt', 'a', encoding='utf-8') as f:
            f.write(json.dumps(j) + '\n')
            f.close()
        print('已完成第' + str(i) + '页')

    DBsession = sessionmaker(bind=engine)
    # 创建一个会话工厂

    with open('j.txt', 'r', encoding='utf-8') as f1:
        filecontent = f1.readlines()
        for i in filecontent:
            print(i)
            j = json.loads(i)
            payload = j['payload']
            for j in payload:
                singleArticle = j

                title = singleArticle['title']
                permalink = singleArticle['permalink']
                date = strtodate(singleArticle['date'])

                sesison = DBsession()
                # 创建一个会话
                p = PMarticle(title=title, url=permalink, date=date)
                # 创建一个ORM对象
                sesison.add(p)
                # 增加事务
                sesison.commit()
                # 提交事务
                sesison.close()
                # 关闭会话


if __name__ == "__main__":
    main()

你可能感兴趣的:(一个简单的爬虫加sqlalchemy ORM实例)