天域至尊 发表于 2019-2-22 12:58

【教程】终于对吾爱下手了,吾爱简单数据爬虫第二课

本帖最后由 天域至尊 于 2019-2-22 13:02 编辑

上次写了思路贴,用来试试管理的水,管理没说啥,谢管理大人的不杀之恩,我改邪归正,继续蹦迪。

第一课帖子地址:https://www.52pojie.cn/thread-874701-1-1.html

呜呜呜,今天心情很不好,实在没忍住,买了树莓派和一堆模块,足足花了我300多大洋,清苦的学生党哪受得了这个,肉疼,肉疼!你说我一个计科的对物联网那么感兴趣干吗?干吗不去学物联网……话不多说,如果有树莓派爱好者,咱们一起交流交流啊。

在正式开始前,还是要给大家讲下规矩,爬虫界有个robots协议,定义可以问万恶的百度,不遵守robots协议是灰产,被告了是黑产,但是爬虫行业基本不遵守……

这是第二课,讲数据库的搭建和爬虫框架的搭建

下一节课讲爬虫的编写与调试,这样,三节课就结束了。

好了,别骂我了,我知道这节课比较水,但是爬虫的编写和调试要很大篇幅的,两个合起来的话,天知道吾爱的编辑器会不会抽风……我还是分开做,免得一口气写不完,重头返工。

接下来回答dj1149的问题,他希望能够做一个数据分析,但是在不登录的情况下,用户组什么的全都看不到,所以我们在这个教程里无法满足这个需求。

Richex同学希望我说明下环境和工具,在此我正式说下:

爬虫环境:win10 64位
数据库系统环境:centos7
数据库:mysql Ver 15.1 Distrib 5.5.60-MariaDB, for Linux (x86_64) using readline 5.1
爬虫框架:Scrapy 1.5.1
编程语言:Python 3.7.2
开发工具:Visual Studio Code 1.31.0

首先,搭建数据库

第一步,分析我们有哪些数据要存储

1.   获取标题
2.   获取类别
3.   获取发布时间
4.   获取查看数与回复数
5.   获取作者名
6.   获取网址
7.   获取作者发布内容长度

首先
标题用varchar存储就行了
类别用varchar也行了
发布时间也用varchar
查看数用int吧
回复数也用int吧
作者名用varchar
网址做主键吧,整体存储网址没意思,只存编号吧。
发布长度用int吧

解释网址为啥存储编号
看网址:https://www.52pojie.cn/thread-874701-1-1.html
你会发现不同网址的链接基本一样,只有中间的数字874701不同。那么我们何必浪费空间存储重复的信息呢,我们只要把这个编号存储就行了,而且可以用它来做主键,防止重复数据录入和方便索引等等。
另外一个是我们要考虑哪些关键字设置为非空,因为爬虫获取数据时,可能会数据获取的不全,我们要保证关键数据的存在,以防止出现完全没意义的数据。
换句话讲,比如你注册一个账号的时候,你不输入密码可以吗?不输入密码就无法登录,所以对方的数据库一定会把密码这列数据设置为非空(不允许录入空值),因为如果这一栏是空值,那么对方的账号就没有意义,何必存储进去呢。
就像这次获取的数据,假如有一条是除了网址以外其他数据都没有,你还想存储它吗?肯定不想,存储这条没意义啊,整个一个空数据啊。所以我们要限制你起码哪些数据是全的,我才让你存储。也防止后来被管理屏蔽的帖子存储进去。
而且这个是跟业务需求息息相关的,在此没有需求,我就简单点,我要最全的,所有项都设置为非空。我是一个简单粗暴的人。

按照业内规则,我列个表

名称
数据库变量名
类型
属性
网址
id
int
主键、非空

标题
name
varchar(100)
非空

类别
class
varchar(30)
非空

发布时间
time
varchar(20)
非空

查看数
view
int
非空

回复数
reply
int
非空

作者名
author
varchar(50)
非空

文章长度
len
int
非空

好了,现在就这样干吧
如果我从centos的安装和命令讲起的话,那给我十节课也讲不完,所以,希望大家有一定的基础,数据库可以简易的部署在本地,但是鉴于老夫的电脑年久失修,穷困潦倒,没钱更换设备,数据库还是搭在我的服务器上吧。
其实目的是为了让本地机器运行更快,东西多了,慢了就痛苦死。数据库的安装我也不讲了,需要学习的同学可以参考这篇博客
https://blog.csdn.net/qq_39091354/article/details/86584517
啦啦啦啦啦啦啦,你看看春秋冬夏,你尝尝酸甜苦辣……
开花开花,我们继续干!
登录数据库

使用other数据库(这个是我提前创建好的,不会创建数据库的可以问度娘)

好啦,图片有每一步的意思。

现在可以宣告,数据库大功告成。
创建爬虫项目
这个项目是在win10系统下的,因为涉及到了命令行,诸位别误以为在Linux系统上。

成功用scrapy框架创建了爬虫项目,win10终端的打开方式是win+R,输入cmd,回车。不会操作的话,问问度娘吧。
接下来创建爬虫文件

记住,一定要进入爬虫项目文件夹里,否则会创建失败的,我们现在导入工程到VS code(这款软件是免费的,可以到官网下载)
注:scrapy安装问题问度娘吧,我不能什么都讲吧。

多么完美的文件结构,心旷神怡,美不胜收,啊,听我赋诗一首……(此处省略一万字)
好了,水水的一节课就结束了,虽然这节课比较水,但是希望不熟悉甚至不知道scrapy框架是什么的同学,去看看资料。
为了凑字数,我在此简单的讲下xpath表达式。
Xpath表达式是很厉害的东西,吾爱多大神,我就用粗俗之言大概说下,希望大神不要鄙视。
我们知道,网页是超文本标记语言,就是我们常说的html,这个家伙有个特点,全是标签。想必大家也都熟悉了。那么,我们要获取的数据是在标签里的,要么是其中的文字,要麽是其中的属性。

好,如果有一个工具,可以让你直接去把某一标签,或者具有某一属性的标签拿出了,随便你去拿他的属性或者文本,是不是舒服的多?

那好,那我们就想想这种工具怎么实现,首先,我需要你告诉我你要拿的是什么标签。
好,弹弹弹,开工。

那人家xpath这个机构吧,人家是这样设计的。
比如你想拿出来所有a标签里的所有子节点
好,表达式就是a

简单吧,如果要所有img标签的所有子节点

表达式就是img

这时候有大佬问了,唉,你说的简单,实用吗?比如我打开一个网页,我需要其中的图片,里面的广告是图片,图标也是图片,我用一个img一截,好家伙,好几十张图片,我只要其中的一张,怎么办?你让我自己选啊?行,就算我吃饱了撑的,我自己选,我要是爬一万个网站呢?还自己选?

大佬说的有道理,所以功力还得提升,这时候呢,人家有教给我们了新东西,你可以从根节点开始选。

比如这段代码

<bookstore>
<book>
<title class="eng1">Harry Potter</title>
<price>29.99</price>
</book>

<book>
<title class="eng2">Learning XML</title>
<price>39.95</price>
</book>
</bookstore>
你从根节点选这样写
开头写一个/跟文件系统一样,下面是bookstore标签,你就把它当文件夹,就成了/bookstore,你要是还往下走,下面的标签是book,就成了/bookstore/book,以此类推。
假如你把表达式/bookstore/book给我的程序,我的程序就会把根下的bookstore下的book给你。跟你在电脑里用的路径一模一样,省事了吧,少了很多重复了吧。

大佬怒了,你放屁!一个网站上千行,你让我给你一个个捋标签结构?真当我闲着蛋疼啊?开玩笑!

人类啊,就是懒,不得已,再次升级。

你不是不想捋结构吗?你给我两个反斜杠,我就把所有出现的这个标签都给你。比如你要book标签下的内容,//book就行,无论book标签出现在哪,我都给你成不?

哎,大佬觉得程序乖巧了很多,但是能不能更乖巧一点呢?就像人类对于情人那样,丑的能换个好看点的吗?好看的,身材能更好点吗?身材好的,能再乖巧点吗?乖巧的,能再可爱点吗?可爱的,能再主动点吗?主动地,能再羞涩点吗?……

算了,算了,反正人类的本质是复读机。大佬润润嗓子说:你乖了很多,但是还要更乖!你看啊,刚刚那串代码,有两个book标签,你让我自己选啊?你能不能再智能点。单独把属于eng1的类的内容给我。

程序成了人工智能,你怕就是人工智障。算了,算了,满足他。

程序增加使用属性区别的功能,比如第一个book的类属性是eng1,这货要的就是这个,那我该怎么让他来描述呢?

好,程序动了动脑子,在标签后面增加中括号,里面描述属性,加一个@区分属性。比如book这个,你可以这样写//book[@class="eng1"],这样程序就只会找所有属性值有class的book标签,并且class的值还是eng1。

大佬嘴角微微一笑,问道,你知不知道,当你拥有了羞涩的对象,你还会惦记着可爱的和主动的等等,我要的不仅仅是新鲜感,而是整个后宫。

程序咽了一口口水,说:明白,以上四个,您可以,完全可以混着用!

哎,这就更赞了。比如获取刚才的内容你可以这样写/bookstore/book[@class="eng1"],还可以bookstore/ book[@class="eng1"]。总之,四个你可以完全换着法用,混和着用。

好,到这里,仅仅讲了入门的知识,起码你简单的知道它是什么了,还不能达到应用的层面,没事,下节课我们就应用,但是,你现在已经能够看懂网上的博客和教程了。可以自己去看看呦。

我的目的不是来几节课就把你培训成大神,不可能。我的目的也不是给你几十页的干货让你去背记。我只是让你入门,轻轻松松的入门并且激发你最大的兴趣!只有有了兴趣,你才愿意去学,去了解。否则要论干货,手册是最好的干货,一句废话也没有,但是有几人用手册入门?

我始终相信在这个纷扰的世界里,兴趣是最好的老师,最好的老师是能够在学习中引导学生兴趣的,不会让他觉得学习是一种不想做却又不得不做的事情。很多人工作了,拖家带口了,无力学习,他们知道,他们如果学习,他们变现的速度要比任何青年和少年都快,他们休闲时间去学习将直接改变他们的生活。但是他们下班宁肯去打扫卫生,宁肯盯着孩子写作业发呆,也不愿意打开书看一眼,为什么?太累了?太忙了?不,是太烦了!

所以,一个老师,要求他整个课程都幽默风趣是无比的难,但是第一节课必须要精心准备,吸引学生兴趣,就跟相亲一样,第一眼恶心到了人家,别指望后来有什么发展,强扭的瓜永远不甜。

言归正传,xpath也好,编程也好,完全可以组建自己的后宫,所谓情场失意,编程得意吗但是,编程跟女友有一个惊人的相似,只要错了,一定是你错了,别找借口,一定是你错了。

而且编程比女友更致命的一点,跟女友吵架你要讲理,她不跟你讲理。编程不是,来,咱讲理,你说咋讲咱就咋讲,但是结果只有一个,还是你错了……

讲完理还是自己错了,不知诸君作何感想。
期待第三课的正餐吧,第三课就要正式开工啦!

old123 发表于 2019-11-19 16:27

第三篇在哪里?没找到啊

天域至尊 发表于 2019-2-22 14:36

田田爱崽崽 发表于 2019-2-22 14:18
老铁为什么还要搭建一个centos系统的mysql作为数据存储?直接用window下的MongoDB不是很好吗?能否讲解一下 ...

差异啊,一个在linux系统上,一个在win系统上,都是封装好的。对于我们来说差异不大,我之所以放在centos上,那是我的云服务器,我不想在本地搭建数据库系统,因为电脑配置不是很好。其实做起来没有什么区别。唯一的要点就是在分布式爬虫上,数据库和爬虫肯定是分开的,内部是高速局域网,爬虫运行速度会很快。但是我们这次不是分布式的。

虞美人草 发表于 2019-2-22 13:09

百度某种程度上还是讲robots的,360它们好像不一定

stars-one 发表于 2019-2-22 13:14

这竟然是与物联网有关,可怕

syx594 发表于 2019-2-22 13:16

专业 不错,比较详细

RoyPenn 发表于 2019-2-22 13:17

robots 感觉遵守的不多,但关键时刻就是一把刀

雨之幽 发表于 2019-2-22 13:17

??看不懂

麦迪就是帅 发表于 2019-2-22 13:34

很详细,谢谢!辛苦了!

SteVen丶Jay 发表于 2019-2-22 13:37

楼主厉害啊,物联网还是很高深

baolei1988 发表于 2019-2-22 13:40

爬一下看看
能爬出来什么东西

chenballack 发表于 2019-2-22 13:41

完成成就:在52pojie看人破解52pojie????哈哈哈哈h
页: [1] 2 3 4 5
查看完整版本: 【教程】终于对吾爱下手了,吾爱简单数据爬虫第二课