爬取糗百内容

GitHub 代码地址https://github.com/injetlee/Python/blob/master/qiubai_crawer.py

微信公众号:【智能制造社区】,欢迎关注。

本文目标

  • 掌握爬虫的基本概念
  • Requests 及 Beautiful Soup 两个 Python 库的基本使用
  • 通过以上知识完成糗百段子抓取

爬虫基本概念

爬虫也称网页蜘蛛,主要用于抓取网页上的特定信息。这在我们需要获取一些信息时非常有用,比如我们可以批量到美图网站下载图片,批量下载段子。省去手工操作的大量时间。爬虫程序一般是通过模拟浏览器对相应URL发出请求,获取数据,并通过正则等手段匹配出页面中我们所需的数据。

在学习爬虫之前,最好到 w3school 去了解一下 HTML 标签的概念以及基本的 CSS 的概念。这会让我们更容易的理解如何获取页面中某个内容。

Requests 库基本介绍

Requests 是学习爬虫的一大利器。是一个优雅简单的 HTTP库。官网介绍如下:

Requests: HTTP for Humans

专门为人类使用的 HTTP 库。使用起来非常简单明了。

我们平时浏览网页的步骤是输入网址,打开。在 Requests 中是如下这样的,我们可以在 Python 交互式解释器中输入以下代码:

  1. import requests
  2. r = requests.get('https://www.qiushibaike.com/text/') # 打开网址,一般我们会设置 请求头,来更逼真的模拟浏览器,下文有介绍
  3. r.text

我门看到下面一堆的代码,其实就是网页的源代码(也可以在浏览器上右键查看页面源代码)。通过这几行代码我们就拿到了页面的所有信息,剩下的就是从页面中找到我们所需要的信息。

Beautiful Soup 库介绍

拿到网页信息后,我们要解析页面,通常来说我们有以下几种方式来解析页面,获取我们所需的信息。

  1. 正则表达式

    • 适用于简单数据的匹配,如果匹配内容较复杂,正则表达式写起来会很绕,同时页面内容稍微变化,正则就会失效
  2. Lxml
    • Lxml 是专门用来解析 XML 格式文件的库,该模块用 C 语言编写,解析速度很快,和正则表达式速度差不多,但是提供了 XPath 和 CSS 选择器等定位元素的方法
  3. Beautiful Soup
    • 这是一个 Python 实现的解析库,相比较于前两种来说,语法会更简单明了一点,文档也比较详细。唯一的一点就是运行速度比前两种方式慢几倍,当数据量非常大时相差会更多。

本文作为入门教程,就从 Beautiful Soup 入手,来学习一下匹配页面所需元素的方法。

假如有以下 HTML 内容 example.html

  1. <html>
  2. <head>
  3. <meta charset="utf-8" />
  4. <meta http-equiv="X-UA-Compatible" content="IE=edge">
  5. <title>Page Title</title>
  6. </head>
  7. <body>
  8. <div class='main-page'>
  9. <ul class='menu-list'>
  10. <li>首页</li>
  11. <li>新闻</li>
  12. <li>影视</li>
  13. </ul>
  14. </div>
  15. </body>
  16. </html>

我们通过 Beautiful Soup 来解析这个 html. 首先我们pip install beautifulsoup4安装这个库,并看一下简单使用。

  1. >>>from bs4 import BeautifulSoup
  2. >>>soup = BeautifulSoup('example.html', 'html.parser') #加载我们的html文件
  3. >>>soup.find('div') # 找到 div 标签
  4. '<div class="main-page">
  5. <ul class="menu-list">
  6. <li>首页</li>
  7. <li>新闻</li>
  8. <li>影视</li>
  9. </ul>
  10. </div>'
  11. >>>soup.find_all('li') # 找到所有 li 标签
  12. '[<li>首页</li>, <li>新闻</li>, <li>影视</li>]'
  13. >>>for i in li:
  14. print(i.text) #获取每个 li 标签的内容
  15. '
  16. 首页
  17. 新闻
  18. 影视
  19. '

详细的操作可以去看一下文档,文档非常详细,例子也很多,简单明了。

糗百爬虫代码

我们先爬取纯文本的内容 https://www.qiushibaike.com/text/ 爬取这个链接下的内容。我们把页面结构截图如下,我们要获取的信息,我用红色的方框进行了标注。

图一:

图二:

  1. import requests
  2. from bs4 import BeautifulSoup
  3. def download_page(url):
  4. headers = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:61.0) Gecko/20100101 Firefox/61.0"}
  5. r = requests.get(url, headers=headers) # 增加headers, 模拟浏览器
  6. return r.text
  7. def get_content(html, page):
  8. output = """第{}页 作者:{} 性别:{} 年龄:{} 点赞:{} 评论:{}\n{}\n------------\n""" # 最终输出格式
  9. soup = BeautifulSoup(html, 'html.parser')
  10. con = soup.find(id='content-left') # 如图一红色方框
  11. con_list = con.find_all('div', class_="article") # 找到文章列表
  12. for i in con_list:
  13. author = i.find('h2').string # 获取作者名字
  14. content = i.find('div', class_='content').find('span').get_text() # 获取内容
  15. stats = i.find('div', class_='stats')
  16. vote = stats.find('span', class_='stats-vote').find('i', class_='number').string
  17. comment = stats.find('span', class_='stats-comments').find('i', class_='number').string
  18. author_info = i.find('div', class_='articleGender') # 获取作者 年龄,性别
  19. if author_info is not None: # 非匿名用户
  20. class_list = author_info['class']
  21. if "womenIcon" in class_list:
  22. gender = '女'
  23. elif "manIcon" in class_list:
  24. gender = '男'
  25. else:
  26. gender = ''
  27. age = author_info.string # 获取年龄
  28. else: # 匿名用户
  29. gender = ''
  30. age = ''
  31. save_txt(output.format(page, author, gender, age, vote, comment, content))
  32. def save_txt(*args):
  33. for i in args:
  34. with open('qiubai.txt', 'a', encoding='utf-8') as f:
  35. f.write(i)
  36. def main():
  37. # 我们点击下面链接,在页面下方可以看到共有13页,可以构造如下 url,
  38. # 当然我们最好是用 Beautiful Soup找到页面底部有多少页。
  39. for i in range(1, 14):
  40. url = 'https://qiushibaike.com/text/page/{}'.format(i)
  41. html = download_page(url)
  42. get_content(html, i)
  43. if __name__ == '__main__':
  44. main()

运行代码后,我们会得到 'qiubai.txt'文件,打开后如下所示

Python 爬虫入门(一)——爬取糗百的更多相关文章

  1. Python 爬虫入门之爬取妹子图

    Python 爬虫入门之爬取妹子图 来源:李英杰  链接: https://segmentfault.com/a/1190000015798452 听说你写代码没动力?本文就给你动力,爬取妹子图.如果 ...

  2. Python 爬虫入门(二)——爬取妹子图

    Python 爬虫入门 听说你写代码没动力?本文就给你动力,爬取妹子图.如果这也没动力那就没救了. GitHub 地址: https://github.com/injetlee/Python/blob ...

  3. python 爬虫入门----案例爬取上海租房图片

    前言 对于一个net开发这爬虫真真的以前没有写过.这段时间学习python爬虫,今天周末无聊写了一段代码爬取上海租房图片,其实很简短就是利用爬虫的第三方库Requests与BeautifulSoup. ...

  4. python 爬虫入门案例----爬取某站上海租房图片

    前言 对于一个net开发这爬虫真真的以前没有写过.这段时间开始学习python爬虫,今天周末无聊写了一段代码爬取上海租房图片,其实很简短就是利用爬虫的第三方库Requests与BeautifulSou ...

  5. Python爬虫入门:爬取豆瓣电影TOP250

    一个很简单的爬虫. 从这里学习的,解释的挺好的:https://xlzd.me/2015/12/16/python-crawler-03 分享写这个代码用到了的学习的链接: BeautifulSoup ...

  6. Python爬虫入门:爬取pixiv

    终于想开始爬自己想爬的网站了.于是就试着爬P站试试手. 我爬的图的目标网址是: http://www.pixiv.net/search.php?word=%E5%9B%9B%E6%9C%88%E3%8 ...

  7. python 爬虫入门1 爬取代理服务器网址

    刚学,只会一点正则,还只能爬1页..以后还会加入测试 #coding:utf-8 import urllib import urllib2 import re #抓取代理服务器地址 Key = 1 u ...

  8. python - 爬虫入门练习 爬取链家网二手房信息

    import requests from bs4 import BeautifulSoup import sqlite3 conn = sqlite3.connect("test.db&qu ...

  9. 【转载】教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神

    原文:教你分分钟学会用python爬虫框架Scrapy爬取心目中的女神 本博文将带领你从入门到精通爬虫框架Scrapy,最终具备爬取任何网页的数据的能力.本文以校花网为例进行爬取,校花网:http:/ ...

随机推荐

  1. Typescript---01 数据类型

    Typescript数据类型 1. 布尔值boolean let isDone: boolean = false; 注意: 使用构造函数Boolean创造的对象不是布尔值,它是一个对象.所以下边的示例 ...

  2. spring-cloud-config-server分布式配置中心

    spring cloud config是一个基于http协议的远程配置实现方式.通过统一的配置管理服务器进行配置管理,客户端通过https协议主动的拉取服务的的配置信息,完成配置获取. spring ...

  3. laravel call传参

    public function index(Request $request, ApplicationContract $app) { $type = $request->query('type ...

  4. cocos creator 动画编辑器以及骨骼动画的使用

    一.普通动画的设置 1.添加动画组件 a.添加空节点=>添加动画组件 b.新建Clip文件=>打开编辑模式添加动画编辑(并且把添加的clip文件拖动到右边面板的Default Clip 与 ...

  5. js高级类型

    一.funciton数据类型 1.定义:一个function类型对象,用于管理一个具体函数. function类型相当于Java中java.lang.reflect.Method 2.函数类型对象创建 ...

  6. 用spark-submit启动程序

    来源:http://spark.apache.org/docs/latest/submitting-applications.html 提交程序常用的一些选项 ./bin/spark-submit \ ...

  7. 在SSL / https下托管SignalR

    https://weblog.west-wind.com/posts/2013/Sep/23/Hosting-SignalR-under-SSLhttps  2013年9月23日•来自毛伊岛,HI• ...

  8. Spark内核

    一些名词概念 AM : ApplicationMaster RM : ResourceManager NM : NodeManager Backend : 后台 RpcEnv : RPC 进程和进程的 ...

  9. 关于<软件>的定义

    百度百科: 软件是一系列按照特定顺序组织的计算机数据和指令的集合.一般来讲软件被划分为系统软件.应用软件和介于这两者之间的中间件. 国标中的定义: 与计算机系统操作有关的计算机程序.规程.规则,以及可 ...

  10. 第六届Code+程序设计网络挑战赛

    弹指能算(easy)模式只做出一道签到题,还WA了一发,我好菜啊啊啊啊...虽然我菜,但是比赛体验一点都不好,服务器老是崩. 比赛链接:https://moocoder.xuetangx.com/de ...