鱼C论坛

 找回密码
 立即注册
查看: 2696|回复: 0

[学习笔记] 爬取糗事百科的爬虫

[复制链接]
发表于 2020-5-25 01:09:26 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 yjptx121 于 2020-6-3 21:42 编辑
  1. import re
  2. import requests
  3. import time

  4. number = 1
  5. HEADERS = {
  6.     'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36'
  7. }
  8. BASE_URL = 'https://www.qiushibaike.com'
  9. full_url = []


  10. def get_url(url='https://www.qiushibaike.com/hot/page/{}/'):         # 获取主页面
  11.     urls = []
  12.     print('获取主页面.....')
  13.     for index in range(1, 9):                                        # 爬取1-9页的段子
  14.         urls.append(url.format(index))
  15.     print('主页面获取完成.....')
  16.     return urls


  17. def get_full_text(url):                                              # 传入主页面,然后获取主页面的子页面集合
  18.     print("获取详细url.....")
  19.     text = requests.get(url, headers=HEADERS).content.decode('utf-8')
  20.     urls = re.findall(r'<div class= "content">. * ? <a href="(.*?)" .*?>', text, re.DOTALL)     # 获取所有符合条件的url
  21.     for index in range(len(urls)):
  22.         full_url.append(BASE_URL + urls[index])                                             # 组合后添加至列表中
  23.     print('详细页面获取完成.....')
  24.     return full_url


  25. def parse_url(url):
  26.     global number
  27.     print('正在解析第{}个网页...'.format(number))
  28.     response = requests.get(url, headers=HEADERS)
  29.     text = response.text
  30.     infos = re.findall(r'<div class="content">(.*?)</div>', text, re.DOTALL)        # 获取段子内容
  31.     contents = []
  32.     for info in infos:                                              # 遍历
  33.         if 350 > len(info) > 50:                                    # 如果长度小于50或大于350,则判定为是图片或小说,忽略,反之则写入
  34.             contents.append(re.sub('<. * ?>' , '', info).strip())      # 去掉空格并替换掉所有的标签
  35.         else:
  36.             print('此页面不符合要求!')
  37.     print('准备写入.....')
  38.     with open('糗事百科内容爬取.txt', 'a', encoding='utf-8') as fp:    # 写入创建好的文件
  39.         for content in contents:
  40.             fp.write('{}我是华丽的分割线,这是第{}条{}\n'.format("-"*50, number, "-"*50))
  41.             fp.write('{}\n\n'.format(content))
  42.             number += 1
  43.     print('写入完成......')
  44.     time.sleep(2)


  45. if __name__ == '__main__':
  46.     url_index = get_url()                            # 获取需要爬取的主页面列表集合
  47.     for each_url in url_index:                       # 遍历,获取每一个主页面
  48.         detail_urls = get_full_text(each_url)        # 获取每一个主页面下的详情页面集合
  49.         for detail_url in detail_urls:               # 遍历,获取每一个段子对应的详情页面
  50.             parse_url(detail_url)                    # 解析页面
  51.     print('所有数据收集完毕!')
复制代码

有做修改,勿怪!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-4-30 03:48

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表