本系列分为四篇:
  • 建站四部曲之后端接口篇(SpringBoot+上线)
  • 建站四部曲之Python数据爬虫篇(selenium)
  • 建站四部曲之前端显示篇(React+上线)
  • 建站四部曲之移动端篇(Android+上线)

零、前言

本系列为了总结一下手上的知识,致敬我的2018
本篇的重点在于:使用python爬取数据写入文件,使用okhttp3访问后台接口插入数据
本篇总结的技术点:Python数据抓取okhttp3访问api接口插入数据库java文件的简单操作
Python是我在学完JavaScript的ES6之后学的,三个字---这么像
于是乎,花了三天看看语法、算算向量、做做爬虫、数数花生后也就没在深究了


一、简书网页分析:

1.问题所在
默认加载9个条目,滚到底再加载9个条目
现在问题在于:直接用链接请求,只能加载9条,怎么能让它自己滚动
是问题肯定有解决方案,百度下呗,满目的selenium,好吧,就决定是你了
复制代码

2.网页标签分析:

需要的数据在note-list的ul中,其中一个li如下:
需要的数据有:content的div下的a标签:href和内容
abstract的p的内容,time的span下的:data-shared-at

<li id="note-38135290" data-note-id="38135290" class="have-img"><a class="wrap-img" href="/p/0baa4b4b81f4" target="_blank"><img class="  img-blur-done" src="//upload-images.jianshu.io/upload_images/9414344-c7c823aafe6938de.png?imageMogr2/auto-orient/strip|imageView2/1/w/300/h/240" alt="120"></a><div class="content"><a class="title" target="_blank" href="/p/0baa4b4b81f4">建站三部曲之后端接口篇(SpringBoot+上线)</a><p class="abstract">本系列分为三篇: 建站三部曲之后端接口篇(SpringBoot+上线) 建站三部曲之前端显示篇(React+上线) 建站三部曲之移动端篇(And...</p><div class="meta"><a target="_blank" href="/p/0baa4b4b81f4"><i class="iconfont ic-list-read"></i> 3
</a>        <a target="_blank" href="/p/0baa4b4b81f4#comments"><i class="iconfont ic-list-comments"></i> 0
</a>      <span><i class="iconfont ic-list-like"></i> 0</span><span class="time" data-shared-at="2018-12-11T13:16:57+08:00">43分钟前</span>
复制代码

二、二十分钟入手selenium

1.添加依赖:
pip install selenium
复制代码

2.下载浏览器插件(我是用Chrome,下载地址:)

注意对应版本下载


3.使用:
from selenium import webdriver #导包driver = webdriver.Chrome("I:\Python\chromedriver.exe")#创建driver,参数为插件的路径
driver.get("https://www.jianshu.com/u/e4e52c116681")#打开网页
driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')#下滑
复制代码

4.间隔时间任务:

问题又来了,貌似只能执行一次,那就用轮训任务吧

TimeTask.py
from datetime import datetime, timedeltaclass TimeTask:def __init__(self):self.count = 0  # 成员变量(实例变量)def runTask(self, func, day=0, hour=0, min=0, second=1, count=20):now = datetime.now()period = timedelta(days=day, hours=hour, minutes=min, seconds=second)next_time = now + periodstrnext_time = next_time.strftime('%Y-%m-%d %H:%M:%S')while self.count < count:# Get system current timeiter_now = datetime.now()iter_now_time = iter_now.strftime('%Y-%m-%d %H:%M:%S')if str(iter_now_time) == str(strnext_time):func()self.count += 1iter_time = iter_now + periodstrnext_time = iter_time.strftime('%Y-%m-%d %H:%M:%S')continue
复制代码
getHtml.py
from selenium import webdriver
from utils.TimeTask import TimeTaskdef fetch():driver.execute_script('window.scrollTo(0, document.body.scrollHeight)')if __name__ == '__main__':driver = webdriver.Chrome("I:\Python\chromedriver.exe")driver.get("https://www.jianshu.com/u/e4e52c116681")timeTask = TimeTask()timeTask.runTask(fetch, 0, 0, 0, 1, 5)
复制代码

三、获取需要的数据:

1.获取名称

selenium的强大之处在于可以查询dom结构,哈哈,css没白学
需要的数据都在content类下,选择器为:.note-list li .content 使用find_elements_by_css_selector可以使用css选择器获取一个list

content = driver.find_elements_by_css_selector('.note-list li .content')#遍历content就行了
for i in content:a = i.find_element_by_css_selector(' a.title') #获取a标签print(a.text) #打印
复制代码

白花花的数据就到手里


2.接下来一样的思路
for i in content:a = i.find_element_by_css_selector(' a.title')info = i.find_element_by_css_selector(' p.abstract')time = i.find_element_by_css_selector('span.time')href = a.get_attribute('href')print(a.text)print(href)print(info.text)print(time.get_attribute("data-shared-at"))
复制代码

3.将字符串写入文件中

将数据稍微装饰一下,以&&&分割每个条目,以```分割每个字段

str = ''
for i in content:a = i.find_element_by_css_selector(' a.title')info = i.find_element_by_css_selector(' p.abstract')time = i.find_element_by_css_selector('span.time')href = a.get_attribute('href')str += a.text + "```"str += href + "```"str += info.text + "```"str += time.get_attribute("data-shared-at").split('T')[0] + "```"str += "&&&"
print(str)
name = 'I:\\Python\\android_data_fetcher\\data\\data.txt'
dirs = os.path.split(name)[0]
is_exist = os.path.exists(dirs)
if not is_exist:os.makedirs(dirs)
f = open(name, "w")
f.write(str)  # 存储到文件中
f.close()
复制代码

Python任务完成,下一个交接棒就交给java了
想想现在能干嘛了——任意一个人的简书主页,点一下都可以自动爬取出文章信息
这对整理自己的文章很有帮助,如果靠手动一篇一篇拷贝,想想都要崩溃


二、使用java访问接口将数据插入服务器

1.文件的读取:
/*** 读取文件** @param in 文件* @param  charSet 读取的编码* @return 文件内容*/
private static String readFile(File in,String charSet) {if (!in.exists() && in.isDirectory()) {return "";}InputStreamReader fr = null;try {fr = new InputStreamReader(new FileInputStream(in), charSet)//字符数组循环读取char[] buf = new char[1024];int len = 0;StringBuilder sb = new StringBuilder();while ((len = fr.read(buf)) != -1) {sb.append(new String(buf, 0, len));}return sb.toString();} catch (Exception e) {e.printStackTrace();return "";} finally {try {if (fr != null) {fr.close();}} catch (Exception e) {e.printStackTrace();}}
}
复制代码

2.读取文件,分割字段
String result = readFile(new File("I:\\Python\\android_data_fetcher\\data\\data.txt"),"gbk");
String[] split = result.split("&&&");
for (String s : split) {String[] item = s.split("```");String name = item[0];//名称String jianshuUrl = item[1];//简书首页String info = item[2];//文章介绍String time = item[3];//创建时间
}
复制代码

3.添加okhttp依赖
 <!-- https://mvnrepository.com/artifact/com.squareup.okhttp3/okhttp --><dependency><groupId>com.squareup.okhttp3</groupId><artifactId>okhttp</artifactId><version>3.12.0</version></dependency>
复制代码

4.post请求插入数据的方法
private static void doPost(String url, String name, String info, String jianshuUrl, String createTime) {//1.HttpClient对象OkHttpClient okHttpClient = new OkHttpClient();//2.构造RequestBodyFormBody body = new FormBody.Builder().add("type", "C").add("name", name).add("localPath", "null").add("jianshuUrl", jianshuUrl).add("juejinUrl", "null").add("info", info).add("imgUrl", name + ".png").add("createTime", createTime).build();Request request = new Request.Builder().url(url).post(body).build();//3.将Request封装为Call对象Call call = okHttpClient.newCall(request);//4.执行Callcall.enqueue(new Callback() {public void onFailure(Call call, IOException e) {}public void onResponse(Call call, Response response) throws IOException {System.out.println(response.body().string());}});
}
复制代码

5.遍历字段时进行插入数据:请求接口见上篇
public static void main(String[] args) {String url = "http://192.168.43.60:8089/api/android/note";String result = readFile(new File("I:\\Python\\android_data_fetcher\\data\\data.txt"),"gbk");String[] split = result.split("&&&");for (String s : split) {String[] item = s.split("```");String name = item[0];String jianshuUrl = item[1];String info = item[2];String time = item[3];System.out.println(name+"  "+jianshuUrl);try {Thread.sleep(10);} catch (InterruptedException e) {e.printStackTrace();}doPost(url,name,info,jianshuUrl,time);}
}
复制代码

6.数据插入到服务器数据库:

由于本地和服务器上的配置都一样,改下ip运行一下就行了:
www.toly1994.com:8089/api/android… 可查所有数据
图片打算自己来挑选,或制作,类型的分类还是自己来吧
数据,就这样吧,虽然简陋了些...以后慢慢来,毕竟0到1是质变,1到2是量变


三、图片的处理

1.简介

先拿一些测试图片来用,数据库中只要存文章名称.png就行了
service层读取的时候做了一些小处理,现在也就是要对测试图片进行重命名

"imgUrl":"http://192.168.10.101:8089/imgs/android/01-React搭建react环境及SCSS的配置.png"
复制代码

2.获取文章名称的列表
ArrayList<String> names = new ArrayList<String>();String[] split = result.split("&&&");
for (String s : split) {String[] item = s.split("```");String name = item[0];names.add(name);}
复制代码

3.遍历文件夹修改名称
private static void renameImg(ArrayList<String> names, File dir) {File[] files = dir.listFiles();for (int i = 0; i < names.size(); i++) {File file = files[i];file.renameTo(new File(file.getParent(),names.get(i)+".png"));}
}
复制代码

4.小问题:

发现有些名字不能做文件名,好吧,考虑步骤,MD5处理一下

//插入数据库时:
.add("imgUrl", Md5Util.getMD5(name) + ".png")//重命名时:
file.renameTo(new File(file.getParent(), Md5Util.getMD5(names.get(i)) + ".png"));
复制代码
public class Md5Util {/*** 获取一个字符串的Md5值** @param content 内容* @return Md5值*/public static String getMD5(String content) {content = content + "芝麻开门";try {MessageDigest digest = MessageDigest.getInstance("MD5");digest.update(content.getBytes());return getHashString(digest);} catch (NoSuchAlgorithmException e) {e.printStackTrace();}return null;}private static String getHashString(MessageDigest digest) {StringBuilder builder = new StringBuilder();for (byte b : digest.digest()) {builder.append(Integer.toHexString((b >> 4) & 0xf));builder.append(Integer.toHexString(b & 0xf));}return builder.toString();}
}复制代码

ok,数据和图片准备齐全,下一站React前端


后记:捷文规范

1.本文成长记录及勘误表
项目源码 日期 备注
V0.1 2018-12-12 建站四部曲之Python爬虫+数据准备篇(selenium)
2.更多关于我
笔名 QQ 微信 爱好
张风捷特烈 1981462002 zdl1994328 语言
我的github 我的简书 我的掘金 个人网站
3.声明

1----本文由张风捷特烈原创,转载请注明
2----欢迎广大编程爱好者共同交流
3----个人能力有限,如有不正之处欢迎大家批评指证,必定虚心改正
4----看到这里,我在此感谢你的喜欢与支持


建站四部曲之Python爬虫+数据准备篇(selenium)相关推荐

  1. 建站四部曲之后端接口篇(SpringBoot+上线)

    本系列分为四篇: 建站四部曲之后端接口篇(SpringBoot+上线) 建站四部曲之Python数据爬虫篇(selenium) 建站四部曲之前端显示篇(React+上线) 建站四部曲之移动端篇(And ...

  2. 建站四部曲之前端显示篇(React+上线)

    本系列分为四篇: 建站四部曲之后端接口篇(SpringBoot+上线) 建站四部曲之Python数据爬虫篇(selenium) 建站四部曲之前端显示篇(React+上线) 建站四部曲之移动端篇(And ...

  3. 建站四部曲之移动端篇(Android+上线)

    本系列分为四篇: 建站四部曲之后端接口篇(SpringBoot+上线) 建站四部曲之Python数据爬虫篇(selenium) 建站四部曲之前端显示篇(React+上线) 建站四部曲之移动端篇(And ...

  4. python爬取网页表格数据匹配,python爬虫——数据爬取和具体解析

    标签:pattern   div   mat   txt   保存   关于   json   result   with open 关于正则表达式的更多用法,可参考链接:https://blog.c ...

  5. Python 爬虫数据写入csv文件中文乱码解决以及天眼查爬虫数据写入csv

    python爬虫数据写入csv文件中文乱码,用'utf-8'在pycharm中打开文件没有问题,但是用excel打开却出现了问题,以下为解决方法. (最近在练习爬虫,这个博文是对自己学习的记录和分享, ...

  6. python爬虫数据解析总结

    python爬虫数据解析总结 目录 python爬虫数据解析总结 1.概述 2.Xpath解析html数据 2.1.基本语法 1.查询语法 2.2.Xpath解析html数据 1.安装lxml库 2. ...

  7. Python爬虫(10)selenium爬虫后数据,存入csv、txt并将存入数据并对数据进行查询

    之前的文章有关于更多操作方式详细解答,本篇基于前面的知识点进行操作,如果不了解可以先看之前的文章 Python爬虫(1)一次性搞定Selenium(新版)8种find_element元素定位方式 Py ...

  8. python 爬虫 数据抓取的三种方式

    python 爬虫   数据抓取的三种方式 常用抽取网页数据的方式有三种:正则表达式.Beautiful Soup.lxml 1.正则表达式 正则表达式有个很大的缺点是难以构造.可读性差.不易适用未来 ...

  9. Python爬虫(9)selenium爬虫后数据,存入mongodb实现增删改查

    之前的文章有关于更多操作方式详细解答,本篇基于前面的知识点进行操作,如果不了解可以先看之前的文章 Python爬虫(1)一次性搞定Selenium(新版)8种find_element元素定位方式 Py ...

最新文章

  1. Maven 概要介绍
  2. ajax判断用户名是否已经存在
  3. 初学WPF之程序启动几种方式
  4. python第八周小测验_Python语言程序设计第2周测验+练习题复盘
  5. angularjs入门学习【应用剖析中篇】
  6. 在列表中根据条件来筛选数据
  7. M6315模块连接阿里云物联网MQTT通讯
  8. gets()gets_s()puts()函数的使用
  9. 机器学习基础(二十六)—— 将 SVM 推广到多类问题
  10. VS code不用集成终端如何修改并推送分支?
  11. DSP28335串口打印 printf
  12. docker安装禅道
  13. psp记忆棒测试软件,psp记忆棒修复工具
  14. JVM常见面试题及详解
  15. 电脑MAC地址查询方法
  16. 一款不错的手机端视频剪辑软件
  17. 使用概率法计算圆周率
  18. 服务器android打包,在服务器上使用 gradle 打包 android 源码
  19. python爬虫之多线程、多进程爬虫
  20. Linux之更改配置文件永久修改IP地址

热门文章

  1. 小白也可以开发闲鱼自动化发布工具!!!
  2. 消融实验(ablation experiment)
  3. 什么是MACD的顶背离和底背离
  4. 帝国cms后台登录显示Table 'empirecms.***_enewsloginfail' doesn't exist
  5. 校园宿舍网的搭建及简单原理分析
  6. Hadoop的rmr和trash
  7. 给计算机老师的一封赞美信,写给计算机老师的感谢信
  8. 阿里云服务器大学生免费领取啦
  9. C语言实现电驴下载完成后自动关机
  10. matlab legend用法