1.糗事百科段子.py

  1. # 目标:爬取糗事百科段子信息(文字)
  2. # 信息包括:作者头像,作者名字,作者等级,段子内容,好笑数目,评论数目
  3. # 解析用学过的几种方法都实验一下①正则表达式.②BeautifulSoup③xpath
  4. import requests
  5. import re # 正则表达式
  6. import json
  7. from bs4 import BeautifulSoup # BS
  8. from lxml import etree # xpath
  9.  
  10. def get_one_page(url):
  11. response = requests.get(url)
  12. if response.status_code == 200:
  13. return response.text
  14. return None
  15.  
  16. def zhengze_parse(html):
  17. pattern = re.compile(
  18. '<img src="//(.*?)".*?alt="(.*?)".*?<a.*?<div class=".*?">(.*?)</div>'
  19. + '.*?<div class=.*?<span>(.*?)</span>.*?<span class=".*?".*?<i.*?>(.*?)<'
  20. + '.*?<i.*?>(.*?)<',
  21. re.S)
  22. items = re.findall(pattern, html)
  23. for item in items:
  24. content = item[3].replace('<br/>', '').strip()
  25. content = content.replace('\x01', '')
  26. if item[5] == '京公网安备11010502031601号':
  27. break
  28. yield {
  29. 'image': "http://" + item[0],
  30. 'name': item[1],
  31. 'grade': item[2],
  32. 'content': content,
  33. 'fun_Num': item[4],
  34. 'com_Num': item[5]
  35. }
  36.  
  37. def soup_parse(html):
  38. soup = BeautifulSoup(html, 'lxml')
  39. for data in soup.find_all('div', class_='article'):
  40. image = "http:" + data.img['src']
  41. name = data.img['alt']
  42. # 匿名用户没有等级
  43. if name=="匿名用户":
  44. grade = "匿名用户"
  45. else:
  46. grade = data.find('div', class_='articleGender').text
  47. content = data.find('div', class_='content').span.text.strip()
  48. fun_Num = data.find('i', class_='number').text
  49. com_Num = data.find('a', class_='qiushi_comments').i.text
  50.  
  51. yield {
  52. 'image': image,
  53. 'name': name,
  54. 'grade': grade,
  55. 'content': content,
  56. 'fun_Num': fun_Num,
  57. 'com_Num': com_Num,
  58. }
  59.  
  60. def xpath_parse(html):
  61. html = etree.HTML(html)
  62. for data in html.xpath('//div[@class="col1"]/div'):
  63. image = "http:"+ str(data.xpath('.//img/@src')[0])
  64. name = data.xpath('.//img/@alt')[0]
  65. if name == '匿名用户':
  66. grade = '匿名用户'
  67. else:
  68. grade = data.xpath('./div[1]/div/text()')[0]
  69. content = data.xpath('./a/div/span/text()')[0:]
  70. content = str(content).strip().replace('\\n','')
  71. fun_Num = data.xpath('./div[2]/span[1]/i/text()')[0]
  72. com_Num = data.xpath('.//div[2]/span[2]/a/i/text()')[0]
  73. # print(image, name, grade, content, fun_Num, com_Num)
  74. yield {
  75. 'image': image,
  76. 'name': name,
  77. 'grade': grade,
  78. 'content': content,
  79. 'fun_Num': fun_Num,
  80. 'com_Num': com_Num,
  81. }
  82.  
  83. def write_to_file(content, flag):
  84. with open('糗百段子(' + str(flag) + ').txt', 'a', encoding='utf-8')as f:
  85. f.write(json.dumps(content, ensure_ascii=False) + '\n')
  86.  
  87. def search(Num):
  88. url = 'https://www.qiushibaike.com/text/page/' + str(Num) + '/'
  89. html = get_one_page(url)
  90. # 正则匹配不到匿名用户的等级,不会匹配匿名用户的段子,所以少一些数据
  91. # 稍微加个判断逻辑就行了,懒得弄了
  92. for item in zhengze_parse(html):
  93. write_to_file(item, '正则表达式')
  94.  
  95. for item in soup_parse(html):
  96. write_to_file(item, 'BS4')
  97.  
  98. for item in xpath_parse(html):
  99. write_to_file(item, 'xpath')
  100. page = str(Num)
  101. print("正在爬取第" + page + '页')
  102.  
  103. def main():
  104. # 提供页码
  105. for Num in range(1, 14):
  106. search(Num)
  107. print("爬取完成")
  108.  
  109. if __name__ == '__main__':
  110. # 入口
  111. main()

  

2.打包

  1. pyinstaller -F 糗事百科段子.py

  

3.运行效果

网页上匿名用户段子的显示情况

<爬虫实战>糗事百科的更多相关文章

  1. 爬虫_糗事百科(scrapy)

    糗事百科scrapy爬虫笔记 1.response是一个'scrapy.http.response.html.HtmlResponse'对象,可以执行xpath,css语法来提取数据 2.提取出来的数 ...

  2. python scrapy实战糗事百科保存到json文件里

    编写qsbk_spider.py爬虫文件 # -*- coding: utf-8 -*- import scrapy from qsbk.items import QsbkItem from scra ...

  3. Python爬虫_糗事百科

    本爬虫任务: 爬虫糗事百科网站(https://www.qiushibaike.com/)--段子版块中所有的[段子].[投票数].[神回复]等内容 步骤: 通过翻页寻找url规律,构造url列表 查 ...

  4. 手动爬虫之糗事百科(ptyhon3)

    一.调用封装的Url_ProxyHelper类,源码如下 import urllib.request as ur class Url_ProxyHelper: def __init__(self, u ...

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

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

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

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

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

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

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

    首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...

  9. Python爬虫实战之爬取糗事百科段子【华为云技术分享】

    首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 友情提示 糗事百科在前一段时间进行了改版,导致之前的代码没法用了,会导致无法输出和CPU占用过高的 ...

随机推荐

  1. JavaScript笔记(第一章,第二章)

    JavaScript笔记(第一章,第二章) 第一章: <meta http-equiv="Content-Type" content="text/html; cha ...

  2. CSS:目录

    ylbtech-CSS:目录 1.返回顶部 1. http://www.runoob.com/css/css-tutorial.html 2. https://www.w3school.com.cn/ ...

  3. jQuery 实现复选框全选、反选及获取选中的值

    实现复选框全选,反选及获取选中的值: 代码如下: <!doctype html> <html lang="en"> <head> <met ...

  4. 设置非阻塞的套接字Socket

    当使用socket()函数和WSASocket()函数创建套接字时,默认都是阻塞的.在创建套接字之后,通过调用ioctlsocket()函数,将该套接字设置为非阻塞模式.函数的第一个参数是套接字,第二 ...

  5. VC++ 2010 创建高级Ribbon界面详解(4)

    5.辅助控件 除了前面我们介绍的按钮,工具栏,编辑框等基本控件外,为了支持现代软件对丰厚的界面交互方式的要求,Visual Studio 2010还提供了很多其他的辅助控件,例如我们通常会用到的“上一 ...

  6. CM 安装CDH 错误: 安装失败。 无法接收 Agent 发出的检测信号。

    在安装CDH的时候出现错误提示: 安装失败. 无法接收 Agent 发出的检测信号. 日志提示错误: start >> raise socket.error(msg) >>er ...

  7. 前端跨域实现的几种方式?及使用Nginx反向代理配置。

    早期为了防止CSRF(跨域请求伪造)的攻击,浏览器引入了同源策略(SOP)来提高安全性.而所谓"同源策略",即同域名(domain或ip).同端口.同协议的才能互相获取资源,而不能 ...

  8. Linux/CentOS 7 timezone 修改

    1.su - 登录root用户 2.timedatectl set-timezone {timezone} (set后面加想要设置的时区) 举例:timedatectl set-timezone As ...

  9. AWS lambda DynamoDB api gateway之间的连接

    创建角色 附加策略 AmazonDynamoDBFullAccess AWSLambdaDynamoDBExecutionRole 创建DynamoDB表 在表的项目中创建内容 this pipi 打 ...

  10. 自定义实现系统max方法

    function MyMath(){ //添加了一个方法 this.getMax=function(){ //所有数字中的最大值 var max=arguments[0]; for(var i=0;i ...