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)
添加到数据库里面了,至此完成
网友评论