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

2018-12-05  本文已影响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)

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


上一篇下一篇

猜你喜欢

热点阅读