和之前的爬虫类博客的爬取思路基本一致:

  • 构造url_list,因为糗事百科的热门栏目默认是13页,所以这个就简单了
  • 遍历发送请求获取响应
  • 提取数据,这里用的是xpath提取,用的是Python的第三方模块lxml
  • 保存数据到本地
  • 爬取的数据有:段子内容、作者性别、作者年龄、作者头像的地址、被标记为好笑的次数

数据处理:

  • 把段子内容中的换行都消除
  • 获取性别操作稍微麻烦一点
  • 头像图片的地址补全
  • 判断是否存在,不存在用None替代
  • 如果想了解更多,可以去 https://www.qiushibaike.com/text/ 抓包分析

程序代码:

 import requests
import json
from lxml import etree class QiubaSpider(object):
"""爬取糗事百科的热门下的数据""" def __init__(self):
self.url_temp = 'https://www.qiushibaike.com/text/page/{}/'
self.headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36',
} def get_url_list(self): # 构造url_list
return [self.url_temp.format(i) for i in range(1, 14)] def pass_url(self, url): # 发送请求
print(url)
response = requests.get(url, headers=self.headers)
return response.content.decode() def get_content_list(self, html_str): # 提取数据
html = etree.HTML(html_str)
div_list = html.xpath('//div[@id="content-left"]/div') # 分组
content_list = []
for div in div_list:
item = {}
# 底下全是利用xpath和一些函数对数据的处理
item['content'] = div.xpath('.//div[@class="content"]/span/text()')
item['content'] = [i.replace('\n', '') for i in item['content']]
item['author_gender'] = div.xpath('.//div[contains(@class, "articleGend")]/@class')
item['author_gender'] = item['author_gender'][0].split(' ')[-1].replace('Icon', '') if len(
item['author_gender']) > 0 else None
item['author_age'] = div.xpath('.//div[contains(@class, "articleGend")]/text()')
item['author_age'] = item['author_age'][0] if len(item['author_age']) > 0 else None
item['author_img'] = div.xpath('.//div[@class="author clearfix"]//img/@src')
item['author_img'] = 'https' + item['author_img'][0] if len(item['author_img']) > 0 else None
item['stats_vote'] = div.xpath('.//span[@class="stats-vote"]/i/text()')
item['stats_vote'] = item['stats_vote'][0] if len(item['stats_vote']) > 0 else None
content_list.append(item)
return content_list def save_content_list(self, content_list):
with open('qiuba.txt', 'a', encoding='utf-8') as f:
f.write(json.dumps(content_list, ensure_ascii=False, indent=4))
f.write('\n') # 换行 def run(self): # 实现主要逻辑
# 1.构造url_list,热门的一共13页
url_list = self.get_url_list()
# 2.遍历发送请求,获取响应
for url in url_list:
html_str = self.pass_url(url)
# 3.提取数据
content_list = self.get_content_list(html_str)
# 4.保存数据
self.save_content_list(content_list)
pass if __name__ == '__main__':
qiubai = QiubaSpider()
qiubai.run()

爬取糗事百科热门段子的数据并保存到本地,xpath的使用的更多相关文章

  1. 初识python 之 爬虫:使用正则表达式爬取“糗事百科 - 文字版”网页数据

    初识python 之 爬虫:使用正则表达式爬取"古诗文"网页数据 的兄弟篇. 详细代码如下: #!/user/bin env python # author:Simple-Sir ...

  2. python爬虫——利用BeautifulSoup4爬取糗事百科的段子

    import requests from bs4 import BeautifulSoup as bs #获取单个页面的源代码网页 def gethtml(pagenum): url = 'http: ...

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

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

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

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

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

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

  6. 芝麻HTTP:Python爬虫实战之爬取糗事百科段子

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

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

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

  8. python 爬虫实战1 爬取糗事百科段子

    首先,糗事百科大家都听说过吧?糗友们发的搞笑的段子一抓一大把,这次我们尝试一下用爬虫把他们抓取下来. 本篇目标 抓取糗事百科热门段子 过滤带有图片的段子 实现每按一次回车显示一个段子的发布时间,发布人 ...

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

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

随机推荐

  1. 欧拉函数(线性筛)(超好Dong)

    欧拉函数:对于一个正整数n,小于n且和n互质的正整数(包括1)的个数,记作φ(n) . #include <bits/stdc++.h> using namespace std; cons ...

  2. vue-cli3项目打包后,在自己搭的服务器上访问打包好的页面空白,处理方法

    我用vue开发的一个小项目,项目开发出雏形,想打包一下放测试,但是我想放测试前自己检查一下经过npm run build打包生成的项目,在本地服务器能不能正常跑,于是,经过网上大哥的帮忙,写了个简易的 ...

  3. Spring——注解

    一.IOC注解 1.用于向Spring容器中注入bean: @Component:向Spring容器中注入bean @Repository:用于标注Dao层 @Service:用于标注Service业 ...

  4. 20.Python类型转换,Python数据类型转换函数大全

    虽然 Python 是弱类型编程语言,不需要像 Java 或 C 语言那样还要在使用变量前声明变量的类型,但在一些特定场景中,仍然需要用到类型转换. 比如说,我们想通过使用 print() 函数输出信 ...

  5. MySQL_8.0与5.7区别之账户与安全

    一.创建用户和用户授权 MySQL5.7创建用户和用户授权命令可以同时执行 grant all privileges on *.* to 'Gary'@'%' identified by 'Gary@ ...

  6. From 7.22 To 7.28

    From 7.22 To 7.28 大纲 竞赛 我们好像要跟队爷考试... 考试的时候做题吧 学科 还是跟之前一样吧, 完型和阅读几乎没做过... 运动 踢足球!!!!!! 可惜bb他们去上海了... ...

  7. mysql基础知识语法汇总整理(二)

    mysql基础知识语法汇总整理(一) insert /*insert*/ insert into 表名(字段列表) values(值列表); --蠕虫复制 (优点:快速复制数据,测试服务器压力) in ...

  8. spring boot 下 mapper接口与xml文件映射问题

    1. @MapperScan @MapperScan("com.streamax.ums.business.dao") 注解扫描的包路径是否有问题 2. 目录结构 mapper接口 ...

  9. C语言博客作业00

    对网络专业的了解 我一直觉得计算机是个很神奇的东西,就像大脑中有思想一样,在一个有形的芯片中能储存着无形的数据.它们的存储方式是什么?读取方式又是什么?为什么2个数字能产生如此巨大的信息?为什么点击鼠 ...

  10. R语言:读入txt文件中文文本出现乱码解决方案

    下载安装 readr 因为使用内置函数 read.table() 读入应该是格式不符合要求会报错 library(readr) help(package="readr") 可以使用 ...