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

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

数据处理:

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

程序代码:

  1. import requests
  2. import json
  3. from lxml import etree
  4.  
  5. class QiubaSpider(object):
  6. """爬取糗事百科的热门下的数据"""
  7.  
  8. def __init__(self):
  9. self.url_temp = 'https://www.qiushibaike.com/text/page/{}/'
  10. self.headers = {
  11. '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',
  12. }
  13.  
  14. def get_url_list(self): # 构造url_list
  15. return [self.url_temp.format(i) for i in range(1, 14)]
  16.  
  17. def pass_url(self, url): # 发送请求
  18. print(url)
  19. response = requests.get(url, headers=self.headers)
  20. return response.content.decode()
  21.  
  22. def get_content_list(self, html_str): # 提取数据
  23. html = etree.HTML(html_str)
  24. div_list = html.xpath('//div[@id="content-left"]/div') # 分组
  25. content_list = []
  26. for div in div_list:
  27. item = {}
  28. # 底下全是利用xpath和一些函数对数据的处理
  29. item['content'] = div.xpath('.//div[@class="content"]/span/text()')
  30. item['content'] = [i.replace('\n', '') for i in item['content']]
  31. item['author_gender'] = div.xpath('.//div[contains(@class, "articleGend")]/@class')
  32. item['author_gender'] = item['author_gender'][0].split(' ')[-1].replace('Icon', '') if len(
  33. item['author_gender']) > 0 else None
  34. item['author_age'] = div.xpath('.//div[contains(@class, "articleGend")]/text()')
  35. item['author_age'] = item['author_age'][0] if len(item['author_age']) > 0 else None
  36. item['author_img'] = div.xpath('.//div[@class="author clearfix"]//img/@src')
  37. item['author_img'] = 'https' + item['author_img'][0] if len(item['author_img']) > 0 else None
  38. item['stats_vote'] = div.xpath('.//span[@class="stats-vote"]/i/text()')
  39. item['stats_vote'] = item['stats_vote'][0] if len(item['stats_vote']) > 0 else None
  40. content_list.append(item)
  41. return content_list
  42.  
  43. def save_content_list(self, content_list):
  44. with open('qiuba.txt', 'a', encoding='utf-8') as f:
  45. f.write(json.dumps(content_list, ensure_ascii=False, indent=4))
  46. f.write('\n') # 换行
  47.  
  48. def run(self): # 实现主要逻辑
  49. # 1.构造url_list,热门的一共13页
  50. url_list = self.get_url_list()
  51. # 2.遍历发送请求,获取响应
  52. for url in url_list:
  53. html_str = self.pass_url(url)
  54. # 3.提取数据
  55. content_list = self.get_content_list(html_str)
  56. # 4.保存数据
  57. self.save_content_list(content_list)
  58. pass
  59.  
  60. if __name__ == '__main__':
  61. qiubai = QiubaSpider()
  62. 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. return返回方法值:狮子玩具

    public class Lion { String color ="黄色"; public void run(){ System.out.println("正在以0.1 ...

  2. axios的post请求方式,怎么把参数直接加在URL后面,不用payload

    export const delUser = (id) => { return axios.post("/user/remove", null, { params:{ id, ...

  3. [笔记]共享内存(shm)

    一.特点 共享内存允许多个不同的进程可以访问同一块内存.相较于其他IPC形式,具有速度快,效率高的特点,共享内存的存在降低了在大规模数据处理过程中内存的消耗. 二.创建共享内存 1.头文件 #incl ...

  4. Linux top常用操作

    是否显示task和cpu行:t 是否显示内存信息行:m 切换信息区域单位:E 切换任务区域单位:e 显示各个CPU单独的数据: 按某列排序: M(内存) P(CPU) N(PID) T(TIME+) ...

  5. tp5无限极分类,限制横向传递(同一体系相互传递)

    1.use fast\Tree; 2. // 判断同线账号(利用当前账号的id查询上下级集合) $alluser = Userinfo::all();  //查询所有用户数据 $tree = Tree ...

  6. legend3---5、lavarel爬坑杂记

    legend3---5.lavarel爬坑杂记 一.总结 一句话总结: 边做边学,变学边做,可能会节约很多时间,熟悉的就跳着看,不熟悉的就慢慢看 1.如何tags表中的主键是t_id而非id,如何使用 ...

  7. [String.Format(转换时间格式)]

    string.Format("{0:d}", System.DateTime.Now);   // 2017/6/2; string.Format("{0:D}" ...

  8. 美团DSP

    https://blog.csdn.net/LW_GHY/article/details/71455535 ADX出价调整, 预估ctr抽样后调整还原 2. 动态调整报价在DSP的报价环节,点击率预估 ...

  9. Struts2常量_Action配置路径_通配符

    Struts2中常用的常量 指定默认编码集,作用于HttpServletRequest的setCharacterEncoding方法 和freemarker .velocity的输出 <cons ...

  10. 微信小程序开发工具下载以及安装教程

    微信公众平台上登录你的微信小程序账号   登录进入小程序开发-工具-下载,再根据你的系统选择相对应的版本地址进行下载.   以管理员身份运行下载,点击下一步,如图所示:   下一步,就会出现许可证协议 ...