江湖小白之一起学Python (一)初爬小说网

朱雀 2020-10-18 06:15 970阅读 0赞

静下心来,我犹豫了很久,还是决定把我从零学python的大体过程记录下,希望能给广大没基础想学python,或者用来做点事的老铁们带来一些便捷的方法。

我相信想学python的老铁们恨不得立刻马上就会爬数据啊什么的,我开始也一样,但看了大部分的书和文章都是劝你从基础开始,打好基础才是为后面学习的关键,话是没错,但是对于想稍微用一下的人就感觉需要花太多精力和时间去学习,以致于大部分人还未开始即结束。淡淡的忧伤~

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p5bG9uZ2Vy_size_16_color_FFFFFF_t_70

我认为学一个新东西首先得保持兴趣,有兴趣才有继续下去的欲望,时不时来点小惊喜,快乐就在其中…… 我们就从实战开始入手,先不管语法什么的什么的,只要先敲好代码跑起来,然后了解大概的意思就OK了,敲得多了自然就大概明白这是什么意思,有那个精力和兴趣再去深入了解语法的基础。好了,废话不多说,直接开始实战代码,那就先爬个小说网练练手吧。

首先你还得安装好下面所需要用到的插件,打开CMD控制台(安装上面的软件成功了,你应该知道怎么打开了吧),来,我们愉快的执行一下下面的命令:

1、pip install requests (爬虫常用的插件,用于访问网页)

2、pip install pyquery (用于解析html网页内容,以前一般用美丽的BS4)

插件库准备已就绪,我们开始起飞~

20200429174940237.png

我是在pyCharm里操作的,先建立一个part1.py的文件

第一行:

  1. #coding:uft-8

(啥意思呢,就是防止中文问题,脚本报错)

接下来导入模块,下面爬去会用到的3个模块,有2个是上面安装的模块,re这个是自带的正则处理模块,不懂,没关系继续……

  1. import requests,re
  2. from pyquery import PyQuery as pq

虽然pyquery封装了requests请求,但我还是单独提出来,以后经常会用到requests模块,下面就拿http://www.530p.com这个小说网练练手(兄弟,对不住,如果你服务器撑不住,我改网址)

我们要抓取一个小说网,首先要找到网址,然后先抓小说目录再抓小说正文,先定义一下网址,然后这样,嗯嗯,再这样……

  1. #网址
  2. url='http://www.530p.com/dushi/tashenshangyoutiaolong-175288/'
  3. #获取网址内容
  4. response=requests.get(url=url)
  5. #来,加上下面这句,获取网页编码防止中文乱码输出
  6. response.encoding = response.apparent_encoding
  7. #获取网页内容
  8. content=response.text

随带说一句,python里#号后面跟的内容是注释,程序是不会执行的,来,输入下面命令打印一下:

  1. print(content)

额,怎么运行脚本,在pycharm中右键点击part1.py,选择run‘part1’:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p5bG9uZ2Vy_size_16_color_FFFFFF_t_70 1

控制台得到的内容:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p5bG9uZ2Vy_size_16_color_FFFFFF_t_70 2

恭喜你,爬取到了网页的html内容,那我们怎么把自己想要的东西提取出来呢,首先要格式化一下html内容,方便解析,这是就用到了pyquery插件

  1. #用pyquery格式化一下网页内容,下面就可以通过标签提出信息了
  2. soup = pq(content)

你没看错,经过上面的一句话,已经格式化好了,接下来稍微有点难度,比如抓取的这个网页,我要抓取它的目录怎么抓呢,首先要分析下html标签,首先在浏览器打开http://www.530p.com/dushi/tashenshangyoutiaolong-175288/这个地址,建议你使用360极速模式或者谷歌、火狐浏览器,踏入程序员的必备浏览器,这里顺便学习怎么使用浏览器调试模式,轻轻的按下F12,就按一下,不出意外下方会出现这样的页面:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p5bG9uZ2Vy_size_16_color_FFFFFF_t_70 3

点击小箭头,移动到一个标题的上方,轻轻一点:

20200429114739904.png

出现下面的内容:

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p5bG9uZ2Vy_size_16_color_FFFFFF_t_70 4

这就是你要抓取的目前的所在标签位置,你有没有发现有很多clc的标签,因为他们的格式是一样的

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p5bG9uZ2Vy_size_16_color_FFFFFF_t_70 5

到此,你多操作几遍,是不是感觉自己快要脱离普通人的行列了~~!以上是做爬虫的一个基本操作,要分析自己所需内容所在的标签位置,额,信息量先不要太大,我们继续,抓取所有clc的标签及内容:

  1. #经分析我们要的内容在div标签"clc"里面,这里涉及到前端的一些东西,继续我们只要知道这是标签,相同的标签显示的外观(样式)是一样的,来走一波
  2. clclist=soup(".clc").items()

我们怎么得到小说的标题和他对应的url地址呢,上面一句得到了所有clc内容,我们就要用for循环一下,遍历下一条一条的数据,什么for循环不懂,ok,没关系,我们继续……

  1. #上面提取到的clclist是数组形式的,什么是数组,有兴趣自己去了解,大概意思就是把东西按顺序依次放在一个盒子里,一个盒子里装了很多同类的东西
  2. for clc in clclist:
  3. # 我们要获取标签里的标题和对应的内容链接地址,先来提取下标题和对应的url地址
  4. # 得到标题
  5. title=clc.text()
  6. #得到标题对应的url
  7. url=clc('a').attr('href')
  8. #来,我们打印下,看结果是不是很happy,当然这里只是抓取到了小说的目录
  9. print(url,title)

这里的写法注意,这里有缩进,小白可能第一次不太懂,下面的内容表示在这个循环内,而且下面得对齐排列,不然就会报错 。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p5bG9uZ2Vy_size_16_color_FFFFFF_t_70 6

来,我们打印下,看结果是不是很Happy, 恭喜你已经成功了一半。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p5bG9uZ2Vy_size_16_color_FFFFFF_t_70 7

下面就到了抓取小说正文环节了,上面我抓到了地址,我怎么去用,比如网页地址是这样的“/dushi/tashenshangyoutiaolong-175288/18015993.htm”,简单的说下,凡是这种类型的,第一个是/表示的根目录,不懂,OK,下一步,凡是这样的你只需要在前面加上域名http://www.530p.com/dushi/tashenshangyoutiaolong-175288/18015993.htm,把这个地址放到浏览器访问下,是不是看到内容了,OK,开始抓取吧,头脑灵活点的小白是不是就知道了,同样的方式去访问抓取这个页面内容,不知道,咱们就继续……

  1. #拼接一下这个网址
  2. detailurl = '{}{}'.format('http://www.530p.com',url)
  3. #上面这句不然懂,简单点你可以写成detailurl ='http://www.530p.com'+url
  4. # 同上面一样,开始获取网页内容
  5. response = requests.get(url=detailurl)
  6. response.encoding = response.apparent_encoding
  7. content = response.text
  8. #再用pyquery格式化一下网页内容
  9. dochtml = pq(content)

来,分析一下网页标签,发现内容都在一个id=”cp_content”的div标签里,到这里你会发现,上面div标签里class=“clc”,这里就涉及到一些前端html标签的知识了,简单说明就是只要是id=什么什么的就用“#”号,class=什么什么的就用“.”号,还是不太明白,OK,没关系,继续……

  1. cp_txt=dochtml("#cp_content")

通过上面获取到了这个标签的内容,获取这个标签的文本内容就按下面写

  1. txt=cp_txt.text()

如果是想获取包含html标签的内容就这样:

  1. txt=cp_txt.html()
  2. 来,txt=cp_txt.text()获取到的内容用print(txt)打印看看,发现最下面有一段自带的标签setFontSize();无弹窗小说网(www.530p.com)

20200429122731822.png

简单粗暴的过滤下:

  1. txt=re.sub('setFontSize\(\);无弹窗小说网\(www.530p.com\)','',txt)

这句不太懂,怎么理解,这句意思就是把第一个单引号中的文字替换为空,第二个单引号表示要换成的内容,为什么括号要加\这个反斜杠(稍微有点用到正则的东西),OK,没关系,继续……,到此你就会循环的2000多个标题对应的正文内容。

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p5bG9uZ2Vy_size_16_color_FFFFFF_t_70 8

看到这里是不是信息量稍微有点大,其实代码两三行,解释一箩筐,要彻底明白一些操作,还是得静下心来,慢慢研究,不过通过上面的操作,是不是有点感觉了

watermark_type_ZmFuZ3poZW5naGVpdGk_shadow_10_text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2p5bG9uZ2Vy_size_16_color_FFFFFF_t_70 9

下面贴个完整的代码:

  1. #coding:utf-8
  2. import requests,re
  3. from pyquery import PyQuery as pq
  4. #虽然pyquery封装了requests请求,但我还是单独提出来,以后经常会用到requests模块
  5. url='http://www.530p.com/dushi/tashenshangyoutiaolong-175288/'
  6. response=requests.get(url=url)
  7. response.encoding = response.apparent_encoding
  8. content=response.text
  9. #用pyquery格式化一下网页内容,下面就可以通过标签提出信息了
  10. soup = pq(content)
  11. clclist=soup(".clc").items()
  12. #循环标题和链接
  13. for clc in clclist:
  14. # 我们要获取标签里的标题和对应的内容链接地址,先来提取下标题
  15. title = clc.text()
  16. url=clc('a').attr('href')
  17. #拼接内容页网页地址
  18. detailurl = '{}{}'.format('http://www.530p.com',url)
  19. response = requests.get(url=detailurl)
  20. response.encoding = response.apparent_encoding
  21. content = response.text
  22. dochtml = pq(content)
  23. cp_txt=dochtml("#cp_content")
  24. # 提取到了标签里的内容,如果想保留html标签,则用cp_txt.html()
  25. txt=cp_txt.text()
  26. #来,打印看看,发现最下面有一段自带的标签setFontSize();无弹窗小说网(www.530p.com),简单粗暴的过滤下
  27. txt=re.sub('setFontSize\(\);无弹窗小说网\(www.530p.com\)','',txt)
  28. print(txt)

好了,初入江湖就到这里了,上面只是基本爬取一个网页内容的步骤,如抓取有些大型或者复杂的网址,那上面这几句还远远不够,不知道上面写的内容,小白能不能看懂,不懂没关系,我们继续~~!先不说太多了,仔细消化,有时间可以了解下requests,pyquery这些插件的参数及用法,咱们下篇再见!

发表评论

表情:
评论列表 (有 0 条评论,970人围观)

还没有评论,来说两句吧...

相关阅读