shengxinjing/fe-advanced-interview

python 10 min系列三之小爬虫(一):简单的信息抓取

shengxinjing opened this issue · 2 comments

python10min系列之小爬虫

前一篇大家表示有点难,写点简单的把,比如命令行里看论坛的十大

据说右上角先给个star再看,能掌握博客代码的100% 哈哈

我是北交大的,所以就拿自己学校练手吧 知行论坛,大家学会方法后,爬什么都很easy啦,用简单的代码,说明简单爬虫的原理即可

文章代码地址

基本所有学校论坛,都有一个十大模块,我们学校也不例外,也是我比较关注的,我们就写个脚本爬一下十大列表吧

图里红色方块,就是我关心的部分,在写爬虫之前,我们先来普及一下基础知识,我们看到的网站,是红红绿绿,挺好看的,但是代码看来,其实就是一大串字符构成,比如我们新建一个文件,zhixing.html,注意,一定要用.html结尾,用文本编辑器打开,输入以下内容

name:<input type="text">
<input type="button" value="click me">

然后双击,浏览器会打开这个页面,你就会看到一个输入框,和一个按钮,见下图,这就是最简单的html

所以我们用代码去抓各种网站,代码其实看到的,就是一堆html标签,我们需要做的,就是从标签里面解析出我们想要的内容,并且输出

我们需要python的requests模块来发送请求,用pyquery来解析数据

# coding=utf-8
import requests

url = 'http://zhixing.bjtu.edu.cn/portal.php'
r = requests.get(url)
print r.text

这几行代码抓取的内容,应该和大家在浏览器里 右键->查看源代码看到的东西是一样的

我们已经获取和网页的内容,肿么拿到十大的内容呢

复杂的html结构,各种层级嵌套,如果想自己写一个解析html的工具,估计还没学会编程就直接狗带了,我们一定要善于使用现有的工具,比如我很喜欢的pyquery,

- pyquery是python的一个模块,使用jquery的语法解析html文档

身为一个前端工程师,对pyquery简直毫无抵抗力,看代码之前,给大家再普及一下,我们在chrome里右键->审查元素(或者点F12),就可以看到浏览器的元素层级结构,具体见下图,我们通过html元素的id或者class属性找到元素即可

先看下F12页面,比如我们查看头部的banner广告

再看十大对应的标签位置

找到了两个模块的id,聚焦的id是portal_block_654,十大的是portal_block_617

再深入寻找十大标题的具体标签,见下图

我们找到了具体的标签,通俗易懂的方式就是,网页里面,id是portal_block_617和标签下面的li标签,下面的a标签就是

- 找id的语法,是#,class是小数点. 标签就是标签名,这是juqey的基本语法,这些基础内容可以直接百度

代码呼之欲出

# coding=utf-8
import requests
from pyquery import PyQuery as pq

url = 'http://zhixing.bjtu.edu.cn/portal.php'
r = requests.get(url)
p = pq(r.text).find('#portal_block_617 li>a')
for d in p:
    print pq(d).text()

效果如图 不动戳大

我们已经成功拿到标题啦,如果想加上今日聚焦,今日聚焦和十大的标签结构有点不太一样,是table包起来的,所以只需要稍微改一下下,代码如下,主要是find的地方不太一样

# coding=utf-8
import requests
from pyquery import PyQuery as pq

url = 'http://zhixing.bjtu.edu.cn/portal.php'
r = requests.get(url)
p = pq(r.text).find('#portal_block_654 table a')
for d in p:
    print pq(d).text()

执行效果如下

bingo,稍微扩展一下上面的代码,把每个十大的连接地址拿出来(今日聚焦的自己扩展吧)

# coding=utf-8
import requests
from pyquery import PyQuery as pq

url = 'http://zhixing.bjtu.edu.cn/portal.php'
r = requests.get(url)
p = pq(r.text).find('#portal_block_617 li>a')
for d in p:
    print pq(d).text()  
    print 'http://zhixing.bjtu.edu.cn/'+pq(d).attr('href')

效果如下

最终结果

今天舍友推荐了首神曲,超越《忐忑》
http://zhixing.bjtu.edu.cn/thread-976923-1-1.html
咱们交大部分人素质真心不敢恭维
http://zhixing.bjtu.edu.cn/thread-976951-1-1.html
大摆长裙如何愉快滴坐下
http://zhixing.bjtu.edu.cn/thread-976887-1-1.html
积分增长这么慢,何日才能升级啊。。。
http://zhixing.bjtu.edu.cn/thread-976954-1-1.html
求推介高清电影论坛
http://zhixing.bjtu.edu.cn/thread-976901-1-1.html
我双十一的包裹终于到北京辣~\(≧▽≦)/~
http://zhixing.bjtu.edu.cn/thread-976912-1-1.html
【论】别人家的学校~
http://zhixing.bjtu.edu.cn/thread-976966-1-1.html
我觉得知行应该搞一个板块叫过往的十大
http://zhixing.bjtu.edu.cn/thread-976946-1-1.html
我觉得在宿舍拖凳子声音应该小点
http://zhixing.bjtu.edu.cn/thread-976928-1-1.html
免费的论文查重网站
http://zhixing.bjtu.edu.cn/thread-976970-1-1.html

今天的第一部分先单这里,我们已经拿到了连接地址,就可以继续去抓帖子的具体地址,还可以根据用户选择,去查看不同帖子的内容,甚至还可以发帖和恢复,但是有一个问题,那就是

- 知行的帖子查看是需要登录的,我们现在直接抓,只会抓到让你登录的信息

我们需要一个东西叫做cookie,我们的登录信息都存放在cookie里面,我们抓取网页的时候,带上登录信息,就像咱们的一卡通一样,不带卡进宿舍楼,就会被拦着,带着一卡通就可以畅通无阻啦,我们就需要带着登录的cookie去抓十大的具体信息就OK拉

后续教程:

  • 模拟登录,抓取十大具体的帖子内容
  • 简单的回复帖子
  • 把十大的信息汇总,生成pdf
  • 会抓取信息,后续扩展就很多啦,比如爬知乎的文章,爬天气预报,然后汇总一下,给自己发邮件都是很easy的拉
  • 利用新浪微博的接口,做一个命令行版的微博,命令行里就可以刷微博
  • 比如知乎上的PC大大,是我很崇拜的,可以把他的专栏 面向工资编程的所有文章都爬下来,拼接一下,自动生成一个pdf,打印出来周末在家慢慢读,这是我下一步要做的教程,大家敬请期待

以上,都是在命令行里执行的 我写代码的间隙,执行一下命令,就可以看下母校的十大,关注一下学校最近的状况,不耽误时间哦

如果您觉得有我写的东西对你帮助,可以打赏点钱给我支付宝支付宝316783812@qq.com或者扫二维码

怎么不更新了啊。。。