美文网首页
12 Splash的使用,使用ORM替代sql语句

12 Splash的使用,使用ORM替代sql语句

作者: 夏威夷的芒果 | 来源:发表于2018-12-05 14:41 被阅读10次

    splash

    Splash是个浏览器代理,开启docker以后,使用以下命令即可开启splash,前提是你装了Splash了。

    docker run -p 8050:8050 scrapinghub/splash
    

    一些异步js的网页(比如新浪微博)对于直接使用requests请求html内容并不友好,所以使用splash可以避免此问题。

    import requests
    from lxml import etree
    from urllib.parse import quote
    
    url = 'https://www.jianshu.com/'
    splashed_url = 'http://localhost:8050/render.html?url=' + quote(url) +'&wait=1'
    #这里使用quote是为了防止wait参数前面的 & 与url中的参数混杂,导致报错
    
    wb_content = requests.get(splashed_url).content
    xpath_page = etree.HTML(wb_content)
    
    #这里再写你要做的事就可以了
    

    SQLAlchemy

    ORM是建立在SQL语言构造器之上的工具集,用于将Python对象映射到数据库的行,提供了一系列接口用于从数据库中存取对象(行)。在ORM 工作时,在底层调用SQL语言构造器的API,这些通用的操作有些许的不同。不同的是,你不再使用行,而是使用自定义类的对象来操作。另外,数据库的查询 方式也不同,ORM的可以生成大多数的SQL查询,除此之外还可以在类中定义更多操作

    import requests
    from lxml import etree
    from urllib.parse import quote
    from sqlalchemy import create_engine,Table,Column,Integer,String,ForeignKey
    from sqlalchemy.orm import sessionmaker
    from sqlalchemy.ext.declarative import declarative_base
    
    engine = create_engine("mysql+pymysql://数据库用户名:密码@地址:端口/数据库名称")
    #数据库名称你要先去sql命令里面创好了
    #通过create_engine()建立连接,create_engine是 Engine实例,create_engine第一次调用的时候会调用Engine.execute()或者 Engine.connect()方法,
    
    Base = declarative_base()
    #SQLAlchemy在中首先通过declarative_base申明一个基类。这个基类维持着类与数据库表的关系
    
    DBSession = sessionmaker(bind=engine)
    session = DBSession()
    
    
    
    url = 'https://www.jianshu.com/'
    splashed_url = 'http://localhost:8050/render.html?url=' + quote(url) +'&wait=1'
    
    class article(Base):  #对应表格
        __tablename__ = 'Jianshu_article'  #自己给这个表格起名字
        id = Column(Integer,primary_key=True)
        title = Column(String(400))
        href = Column(String(400))
        intro = Column(String(400))
        writer = Column(String(400))
        comment_num = Column(Integer)
        like_num = Column(Integer)
    
        @classmethod
        def save(cls,data):
            try:
                session.add(data)   #session上直接add就完事儿了
                session.commit()
            except:
                session.rollback()
            return data.id
    Base.metadata.create_all(engine)
    #MetaData是个注册表,包括能够一组执行的命令到数据库,上面声明了表的类
    #但库中并没创建表,通过Base.metadata.create_all(engine)向数据库发出建表完成类与表的映射
    
    
    
    wb_content = requests.get(splashed_url).content
    xpath_page = etree.HTML(wb_content)
    
    ids = xpath_page.xpath('//li[@data-note-id]/@data-note-id')
    titles = xpath_page.xpath('//li[@data-note-id]/div/a/text()')
    hrefs = xpath_page.xpath('//li[@data-note-id]/div/a/@href')
    intros = xpath_page.xpath('//li[@data-note-id]/div/p/text()')
    writers = xpath_page.xpath('//*[@data-note-id]/div/div/a[@class="nickname"]/text()')
    comments = xpath_page.xpath('//*[@data-note-id]/div/div/a[contains(@href,"comments")]/text()[2]')
    likes = xpath_page.xpath('//*[@data-note-id]/div/div/span/text()')
    
    for id,title, href,intro,writer,comment_num,like_num in zip(ids,titles,hrefs,intros,writers,comments,likes):
        jsa = article()
        jsa.id = id
        jsa.title = title
        jsa.href = href
        jsa.intro = intro
        jsa.writer = writer
        jsa.comment_num = comment_num.strip()
        jsa.like_num = like_num.strip()
        print(id,title, href,intro,writer,comment_num,like_num)
        jsa.save(jsa)
        print(jsa)
    
    

    添加到数据库里面了,至此完成


    相关文章

      网友评论

          本文标题:12 Splash的使用,使用ORM替代sql语句

          本文链接:https://www.haomeiwen.com/subject/wpaicqtx.html