我的编程空间,编程开发者的网络收藏夹
学习永远不晚

手写爬虫之糗事百科段子及神回复

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

手写爬虫之糗事百科段子及神回复

先贴代码吧,然后再说遇到的坑

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2018/10/11 16:35
# @Author  : yuantup
# @Site    : 
# @File    : jokes_.py
# @Software: PyCharm


import urllib.request
import re
import os


def open_url(url):
    head = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/5'
                          '37.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36'}
    req = urllib.request.Request(url, headers=head)
    response = urllib.request.urlopen(req)
    html = response.read()
    return html


def get_content(html):
    text1 = html.decode('utf-8')
    text2 = text1.replace('\n', '')
    text3 = text2.replace('<br>', '\n')
    text = text3.replace('<br/>', '\n')
    pattern = '<h2>(.*?)</h2>.*?<div class="content">.*?span>(.*?)</span>.*?<span class="stats-vote"><i class="number">(.*?)</i> 好笑</span>.*?<span class="cmt-name">(.*?)</span><div class="main-text">(.*?)<div class="likenum">.*?(\d*?)</div>'
    all_content_list = re.findall(pattern, text, re.S)
    print(all_content_list)

    for i in range(len(all_content_list)):
        with open('jokes_plus.txt', 'a', encoding='utf-8') as f:
            author = all_content_list[i][0]
            joker_content = all_content_list[i][1]
            fun_num = all_content_list[i][2]
            commentator = all_content_list[i][3]
            comment = all_content_list[i][4]
            dianzan_num = all_content_list[i][5]
            f.write('******这不是一条分界线*****\n\n')
            f.write(author + ':')
            print('1')
            f.write(':\n')
            f.write(joker_content)
            print('2')
            f.write('\n')
            f.write('有')
            f.write(fun_num)
            print('3')
            f.write('人觉得这个段子很好笑,你觉得呢?')
            f.write('\n')
            f.write('神评:')
            f.write('\n')
            f.write(commentator + ':')
            f.write(comment)
            f.write('    点赞数:')
            f.write(dianzan_num)
            f.write('\n\n')


def main():
    path = 'E:\spiser_sons\jokes'
    a = os.getcwd()
    print(a)
    if os.path.exists(path):
        os.chdir(path)
        print(os.getcwd())
    else:
        os.mkdir(path)
        os.chdir(path)

    for i in range(1, 21):
        url = 'https://www.qiushibaike.com/text/page/' + str(i) + '/'
        html = open_url(url)
        get_content(html)


if __name__ == '__main__':
    main()

我是将爬取的代码整合到一个txt文件中,

运行结果如图:

 

 昨天没仔细看,我代码里是计划爬取20页小段子的,现在发现从第十四页开始就和第一页重复了!!!

 

用浏览器进入糗事百科的网址,发现确实只有13页,当页数大于13时,自动跳转为第一页。

 

看来以后还是要更加仔细!

 

最后得到的文件及部分内容:

 

 

 勉强能看,有艺术细胞的可以加工一下,hhhhh

 

坑一:

爬取下来的文字中夹杂这<br><br/>,使用字符串的替换方法replace(),或者用re.sub()也可以

 

坑二:

这是我写的正则表达式:

'<h2>(.*?)</h2>.*?<div class="content">.*?span>(.*?)</span>.*?<span class="stats-vote"><i class="number">(.*?)</i> 好笑</span>.*?<span class="cmt-name">(.*?)</span><div class="main-text">(.*?)<div class="likenum">.*?(\d*?)</div>'

可以看到里面有很多小括号,这个时候我们用re.findall()得到的返回值是一个列表,每匹配一次列表就添加一个元素(元组),要理清他们的关系,搞混了就很难得到需要的内容

类似于这样的:all_content_list = [(第1组数据),(第2组数据),(第3组数据)......]

                       每组数据里包含6个数据,分别是

(

author,  # 段子的作者名
joker_content,  # 段子的内容
fun_num,   # 觉得段子好笑的人数
commentator,  # 神评的作者名
comment, # 神评的内容
dianzan_num  # 神评点赞人数

)

 它这个编辑器自动换行了我去。

 

 坑三(未解决):

就是我写的正则表达式过长,我试着用pycharm里的灯泡解决问题,它给我换行之后就匹配不上我需要的内容了,求助各位大佬有啥好的解决办法没有!!!

灯泡是这个:

点击第一行后:

 

 pycharm 也没有警告了,但是也匹配不到东西的,还原成一行又可以成共匹配。

 

我自己感觉是不是因为换行之后多出了\n,或者是表示换行的'\'没有被转义,我怎么感觉我找到答案了我去

 

试试去。。。。。

我还以为在=后面加个'r'就行。。。。。

 

失败了,不行。。。。。

 

求助各位大佬给个建议,谢谢

 

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

手写爬虫之糗事百科段子及神回复

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

手写爬虫之糗事百科段子及神回复

先贴代码吧,然后再说遇到的坑#!/usr/bin/env python# -*- coding: utf-8 -*-# @Time : 2018/10/11 16:35# @Author : yuantup# @Site :
2023-01-30

玩转python爬虫之爬取糗事百科段子

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

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录