Python爬虫批量下载糗事百科段子,怀念的天王盖地虎,小鸡炖蘑菇...

举报
技术火炬手 发表于 2019/08/15 11:11:21 2019/08/15
【摘要】 成年人的世界没有容易二字啊!

成年人的世界

别人公众号粉丝刷刷的涨,我的佛系公众号关注全靠随缘。本来挺不淡定的,但今天现实给我上了一课啊。

image.png

财大气粗的地产商们都开始搞公众号了,关注公众号就送一个饭盒,你说这涨粉速度能跟别人比么…成年人的世界没有容易二字啊…

不,有容易的 !

容易胖、容易老、容易头发变稀少;

容易困、容易丑、容易变成单身狗;

容易失眠一整夜,容易加班没补贴…

这些貌似都挺容易的啊,哈哈。

自娱自乐

今天朋友发了一个段子,居然来自糗事百科…随着抖音、快手的各种火爆,仿佛从前拿着手机刷糗百的日子,已经过去好久了。不知道多少人还会念起那句“天王盖地虎,小鸡炖蘑菇…”。今天就做个小练习,爬一爬糗事百科上的段子吧!

网站分析

段子内容首页

糗百的段子栏目格式比较简单:

https://www.qiushibaike.com/text/page/<page_number>/

网站分析

网页格式就更为简单了:

image.png

每次数据定位都是用class没有创新意识,这次增加一点难度,在beautifulsoup中引入一下正则吧!可以看到没调内容的id格式都是qiushi_tage_numbers,那么我们是否可以这么定位:

findAll('div', {'id': re.compile("qiushi_tag_[0-9]+")})

避坑指南

image.png

分析段子发现,有些段子内容过长,会出现部分展示的问题,此时我们需要针对这些存在查看全文的段子,获取它的子链接,然后进入新的页面,获取所有段子内容,再进行保存。即当段子内容中存在<span class="contentForAll">查看全文</span>

整体代码

段子每页25条内容,为了减少服务器的压力,我们就默认每次获取10页内容即可:

# -*- coding: utf-8 -*-
# @Author   : 王翔
# @JianShu  : 清风Python
# @Date     : 2019/8/15 1:21
# @Software : PyCharm
# @version  :Python 3.7.3
# @File     : JokeCrawler.py

import requests
from bs4 import BeautifulSoup
import re
import time


class JokeCrawler:
   def __init__(self):
       self.host = "https://www.qiushibaike.com"
       self.headers = {'User-Agent': ('Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 '
                                      '(KHTML, like Gecko) Chrome/75.0.3770.100 Safari/537.36')}
       _time = time.strftime('%y%m%d.%H.%M.%S', time.localtime())
       self.file = open('糗事百科{}.txt'.format(_time),
                        'w+', encoding='utf-8')

   def get_request(self, url):
       r = requests.get(url, headers=self.headers)
       return BeautifulSoup(r.text, 'lxml')

   def crawler(self, url):
       jokes = self.get_request(url).findAll('div', {'id': re.compile("qiushi_tag_[0-9]+")})
       for number, joke in enumerate(jokes, start=1):
           if joke.find('span', {'class': "contentForAll"}):
               _href = joke.find('a', {"class": "contentHerf"})['href']
               content = self.get_request(self.host + _href).find('div', {"class": "content"}).text.strip()
           else:
               content = joke.find('div', {"class": "content"}).text.strip()
           self.file.write("{}.{}\n".format(number, content))

   def run(self):
       for page in range(1, 11):
           _url = "{}/text/page/{}".format(self.host, page)
           self.file.write("第{}页\n\n".format(page))
           self.crawler(_url)

   def __exit__(self):
       self.file.close()


if __name__ == '__main__':
   main = JokeCrawler()
   main.run()

来看看我们最终的爬虫结果吧

没事儿爬上些段子,休息时候慢慢看吧….

image.png

The End

OK,今天的内容就到这里,欢迎大家关注“清风Python”

分割线动图.gif

本文来自“清风Python”


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。