这次爬取的网站是糗事百科,网址是:http://www.qiushibaike.com/hot/page/1

分析网址,参数'page/'后面的数字''指的是页数,第二页就是'/page/2',以此类推。。。

一、分析网页

然后明确要爬取的元素:作者名、内容、好笑数、以及评论数量

每一个段子的信息存放在'div id="content-left"'下的div中

爬取元素的所在位置

二、爬取部分

  工具  

   Python3

   requests

   xpath

  1、获取每一个段子

  1. # 返回页面的div_list
  2. def getHtmlDivList(self, pageIndex):
  3. pageUrl = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)
  4. html = requests.get(url=pageUrl, headers=self.headers).text
  5. selector = etree.HTML(html)
  6. divList = selector.xpath('//div[@id="content-left"]/div')
  7. return divList

  每一个段子都在div中,这里用xpath,筛选出来后返回的是一个列表,每一个div都在里面

  

  2、获取每一个段子中的元素

  1. def getHtmlItems(self, divList):
  2.  
  3. items = []
  4.  
  5. for div in divList:
  6. item = []
  7. # 发布人
  8. name = div.xpath('.//h2/text()')[0].replace("\n", "")
  9. item.append(name)
  10.  
  11. # 内容(阅读全文)
  12. contentForAll = div.xpath('.//div[@class="content"]/span[@class="contentForAll"]')
  13. if contentForAll:
  14. contentForAllHref = div.xpath('.//a[@class="contentHerf"]/@href')[0]
  15. contentForAllHref = "https://www.qiushibaike.com" + contentForAllHref
  16. contentForAllHrefPage = requests.get(url=contentForAllHref).text
  17. selector2 = etree.HTML(contentForAllHrefPage)
  18. content = selector2.xpath('//div[@class="content"]/text()')
  19. content = "".join(content)
  20. content = content.replace("\n", "")
  21. else:
  22. content = div.xpath('.//div[@class="content"]/span/text()')
  23. content = "".join(content)
  24. content = content.replace("\n", "")
  25. item.append(content)
  26.  
  27. # 点赞数
  28. love = div.xpath('.//span[@class="stats-vote"]/i[@class="number"]/text()')
  29. love = love[0]
  30. item.append(love)
  31.  
  32. # 评论人数
  33. num = div.xpath('.//span[@class="stats-comments"]//i[@class="number"]/text()')
  34. num = num[0]
  35. item.append(num)
  36.  
  37. items.append(item)
  38.  
  39. return items

  这里需要注意的是,xpath返回的是一个列表,筛选出来后需要用[0]获取到字符串类型

  上面的代码中,爬取的内容里,有的段子是这样的,如下图:   

  内容中会有标签<br>,那么用xpath爬取出来后,里面的内容都会成一个列表(这里的div就是列表),

  那div[0]就是"有一次回老家看姥姥,遇到舅妈说到表弟小时候的事~",所以需要将div转换成字符串  

  其他的部分就xpath语法的使用

  3、保存进文本

  1. # 保存入文本
  2. def saveItem(self, items):
  3. f = open('F:\\Pythontest1\\qiushi.txt', "a", encoding='UTF-8')
  4.  
  5. for item in items:
  6. name = item[0]
  7. content = item[1]
  8. love = item[2]
  9. num = item[3]
  10.  
  11. # 写入文本
  12. f.write("发布人:" + name + '\n')
  13. f.write("内容:" + content + '\n')
  14. f.write("点赞数:" + love + '\t')
  15. f.write("评论人数:" + num)
  16. f.write('\n\n')
  17.  
  18. f.close()

  

  4、全部代码 

  1. import os
  2. import re
  3. import requests
  4. from lxml import etree
  5.  
  6. # 糗事百科爬虫
  7. class QSBK:
  8. # 初始化方法,定义变量
  9. def __init__(self):
  10. self.pageIndex = 1
  11. self.headers = {
  12. "User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/59.0.3071.86 Safari/537.36"
  13. }
  14. self.enable = False
  15.  
  16. # 返回页面的div_list
  17. def getHtmlDivList(self, pageIndex):
  18. pageUrl = 'http://www.qiushibaike.com/hot/page/' + str(pageIndex)
  19. html = requests.get(url=pageUrl, headers=self.headers).text
  20. selector = etree.HTML(html)
  21. divList = selector.xpath('//div[@id="content-left"]/div')
  22. return divList
  23.  
  24. # 获取文本中要截取的元素
  25. def getHtmlItems(self, divList):
  26.  
  27. items = []
  28.  
  29. for div in divList:
  30. item = []
  31. # 发布人
  32. name = div.xpath('.//h2/text()')[0].replace("\n", "")
  33. item.append(name)
  34.  
  35. # 内容(阅读全文)
  36. contentForAll = div.xpath('.//div[@class="content"]/span[@class="contentForAll"]')
  37. if contentForAll:
  38. contentForAllHref = div.xpath('.//a[@class="contentHerf"]/@href')[0]
  39. contentForAllHref = "https://www.qiushibaike.com" + contentForAllHref
  40. contentForAllHrefPage = requests.get(url=contentForAllHref).text
  41. selector2 = etree.HTML(contentForAllHrefPage)
  42. content = selector2.xpath('//div[@class="content"]/text()')
  43. content = "".join(content)
  44. content = content.replace("\n", "")
  45. else:
  46. content = div.xpath('.//div[@class="content"]/span/text()')
  47. content = "".join(content)
  48. content = content.replace("\n", "")
  49. item.append(content)
  50.  
  51. # 点赞数
  52. love = div.xpath('.//span[@class="stats-vote"]/i[@class="number"]/text()')
  53. love = love[0]
  54. item.append(love)
  55.  
  56. # 评论人数
  57. num = div.xpath('.//span[@class="stats-comments"]//i[@class="number"]/text()')
  58. num = num[0]
  59. item.append(num)
  60.  
  61. items.append(item)
  62.  
  63. return items
  64.  
  65. # 保存入文本
  66. def saveItem(self, items):
  67. f = open('F:\\Pythontest1\\qiushi.txt', "a", encoding='UTF-8')
  68.  
  69. for item in items:
  70. name = item[0]
  71. content = item[1]
  72. love = item[2]
  73. num = item[3]
  74.  
  75. # 写入文本
  76. f.write("发布人:" + name + '\n')
  77. f.write("内容:" + content + '\n')
  78. f.write("点赞数:" + love + '\t')
  79. f.write("评论人数:" + num)
  80. f.write('\n\n')
  81.  
  82. f.close()
  83.  
  84. # 判断文本是否已创建,添加路径
  85. def judgePath(self):
  86. if os.path.exists('F:\\Pythontest1') == False:
  87. os.mkdir('F:\\Pythontest1')
  88. if os.path.exists("F:\\Pythontest1\\qiushi.txt") == True:
  89. os.remove("F:\\Pythontest1\\qiushi.txt")
  90.  
  91. def start(self):
  92. self.judgePath()
  93. print("正在读取糗事百科,按回车继续保存下一页,Q退出")
  94. self.enable = True
  95. while self.enable:
  96. divList = self.getHtmlDivList(self.pageIndex)
  97. data = self.getHtmlItems(divList)
  98. self.saveItem(data)
  99. print('已保存第%d页的内容' % self.pageIndex)
  100. pan = input('是否继续保存:')
  101. if pan != 'Q':
  102. self.pageIndex += 1
  103. self.enable = True
  104. else:
  105. print('程序运行结束!!')
  106. self.enable = False
  107.  
  108. spider = QSBK()
  109. spider.start()

python3 爬虫---爬取糗事百科的更多相关文章

  1. python学习(十六)写爬虫爬取糗事百科段子

    原文链接:爬取糗事百科段子 利用前面学到的文件.正则表达式.urllib的知识,综合运用,爬取糗事百科的段子先用urllib库获取糗事百科热帖第一页的数据.并打开文件进行保存,正好可以熟悉一下之前学过 ...

  2. Python爬虫爬取糗事百科段子内容

    参照网上的教程再做修改,抓取糗事百科段子(去除图片),详情见下面源码: #coding=utf-8#!/usr/bin/pythonimport urllibimport urllib2import ...

  3. Python爬虫-爬取糗事百科段子

    闲来无事,学学python爬虫. 在正式学爬虫前,简单学习了下HTML和CSS,了解了网页的基本结构后,更加快速入门. 1.获取糗事百科url http://www.qiushibaike.com/h ...

  4. python爬虫之爬取糗事百科并将爬取内容保存至Excel中

    本篇博文为使用python爬虫爬取糗事百科content并将爬取内容存入excel中保存·. 实验环境:Windows10   代码编辑工具:pycharm 使用selenium(自动化测试工具)+p ...

  5. python_爬虫一之爬取糗事百科上的段子

    目标 抓取糗事百科上的段子 实现每按一次回车显示一个段子 输入想要看的页数,按 'Q' 或者 'q' 退出 实现思路 目标网址:糗事百科 使用requests抓取页面  requests官方教程 使用 ...

  6. 8.Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  7. python网络爬虫--简单爬取糗事百科

    刚开始学习python爬虫,写了一个简单python程序爬取糗事百科. 具体步骤是这样的:首先查看糗事百科的url:http://www.qiushibaike.com/8hr/page/2/?s=4 ...

  8. Python爬虫实战一之爬取糗事百科段子

    大家好,前面入门已经说了那么多基础知识了,下面我们做几个实战项目来挑战一下吧.那么这次为大家带来,Python爬取糗事百科的小段子的例子. 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把 ...

  9. 转 Python爬虫实战一之爬取糗事百科段子

    静觅 » Python爬虫实战一之爬取糗事百科段子 首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致 ...

随机推荐

  1. java爬虫--jsoup简单的表单抓取案例

    分析需求: 某农产品网站的农产品价格抓取 网站链接:点击打开链接 页面展示如上: 标签展示如上: 分析发现每日价格行情包括了蔬菜,水果,肉等所有的信息,所以直接抓每日行情的内容就可以实现抓取全部数据. ...

  2. android+eclipse+mysql+servlet(Android与mysql建立链接)

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原创地址  .作者信息和本声明.http://www.cnblogs.com/zhu520/p/7724524.html 经过两天的时间我终于把A ...

  3. JavaNIO阻塞IO添加服务器反馈

    package com.java.NIO; import java.io.IOException; import java.net.InetSocketAddress; import java.nio ...

  4. 区分window8中 ie10 window phone8

    Internet Explorer 10 并没有对 屏幕的宽度 和 视口(viewport)的宽度 进行区分   @-webkit-viewport   { width: device-width; ...

  5. return flase 作用

    调用return false的时候,他实际上做了三件事   event.preventDefault();     禁止默认行为   event.stopPropagation();   阻止冒泡   ...

  6. 服务器 : Apache Tomcat - 理解架构层次

    文章概览 相信很多接触java的人都对Tom猫有着多少的熟悉,就个人而言,本来只知道Tom简单的操作与配置,就像裹上一层纱,迷迷糊糊的. Tomcat的书籍本来就不多,高分的还是很久之前的版本,直到最 ...

  7. 应用在安卓和ios端APP的证件识别

    移动端证件识别智能图文处理,是利用OCR识别技术,通过手机拍摄身份证图像或者从手机相册中加载证件图像,过滤身份证的背景底纹干扰,自动分析证件各文字进行字符切分.识别,最后将识别结果按姓名.地址.民族. ...

  8. 【2】构建一个SSM项目结构

    初步思考一下这个项目的结构,由于是给一个比较老的公司做这个外包项目,服务器是搭建在windows操作系统上的Tomcat6.0,系统的JDK版本也是JDK1.6,都是比较旧. 数据库方面有专人负责,所 ...

  9. 如何实现border-width:0.5px;

    工作中遇到了一个产品需求,要求把列表分割线改成0.5px,直接写成border:0.5px solid #cccccc;是不符合规范的写法,会存在Android和IOS手机上的兼容问题,故,我们可以利 ...

  10. [转载] 谷歌技术"三宝"之BigTable

    转载自http://blog.csdn.net/opennaive/article/details/7532589 2006年的OSDI有两篇google的论文,分别是BigTable和Chubby. ...