zoukankan      html  css  js  c++  java
  • [爬虫]用python的requests模块爬取糗事百科段子

      虽然Python的标准库中 urllib2 模块已经包含了平常我们使用的大多数功能,但是它的 API 使用起来让人感觉不太好,而 Requests 自称 “HTTP for Humans”,说明使用更简洁方便。Requests 继承了urllib2的所有特性。Requests支持HTTP连接保持和连接池,支持使用cookie保持会话,支持文件上传,支持自动确定响应内容的编码,支持国际化的 URL 和 POST 数据自动编码。

      爬取糗事百科网站https://www.qiushibaike.com/段子,需要分两步解析数据的过程。首先将html页面整体爬下来,然后再利用正则将不需要字符过滤。

      第一步解析:

    re.compile('<div class="content">.*?</div>', re.S) # 匹配出包含段子的标签

      第二步解析:

    re.compile(r'<.*?>|&(.*?);|s|  ') # 将除了汉字以外的所有字符去掉

    整体代码为:

     1 # -*- coding:utf-8 -*-
     2 #  2018/9/13  12:00
     3 import requests
     4 import re
     5 import time
     6 from requests.packages.urllib3.poolmanager import PoolManager
     7 from requests.packages.urllib3.exceptions import InsecureRequestWarning,InsecurePlatformWarning
     8 requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
     9 requests.packages.urllib3.disable_warnings(InsecurePlatformWarning)
    10 
    11 class Qiubai_spider(object):
    12     """糗事百科段子爬虫"""
    13 
    14     def __init__(self):
    15         self.base_url = "https://www.qiushibaike.com/hot/"
    16         self.headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"}
    17         self.analysis_pattern = re.compile('<div class="content">.*?</div>', re.S)
    18         self.analysis_pattern_t = re.compile(r'<.*?>|&(.*?);|s|  ')
    19     # 第一次解析 <div class ="content" >(.*?)</div>
    20     def send_request(self, url):
    21         """发送请求"""
    22         time.sleep(2)
    23         try:
    24             response = requests.get(url, headers=self.headers)
    25             return response.content
    26         except Exception, err:
    27             print err
    28 
    29     def write_file(self, data, page):
    30         """写入数据"""
    31         with open('qiushiduanzi1.txt', 'a') as f:
    32             filename = "" + str(page) + "页的段子
    "
    33             print  filename
    34             f.write(filename)
    35             for content in data:
    36                 second_data = self.analysis_pattern_t.sub('', content)
    37                 f.write(second_data)
    38                 f.write("
    
    
    ")
    39 
    40     def analysis_data(self, data):
    41         """数据分析提取"""
    42         analysis_list = self.analysis_pattern.findall(data)
    43         return analysis_list
    44 
    45     def start_work(self):
    46         """启动爬虫流程"""
    47         for page in range(1, 10):
    48             # 拼接url
    49             url = self.base_url + "page/" + str(page) + '/' + '.html'
    50 
    51             # 发送请求
    52             data = self.send_request(url)
    53 
    54             # 解析数据
    55             analysis_db = self.analysis_data(data)
    56 
    57             # 写入数据
    58             self.write_file(analysis_db, page)
    59 
    60 if __name__ == '__main__':
    61 
    62     tool = Qiubai_spider()
    63     tool.start_work()
    糗事爬虫代码

    爬取后的效果:

  • 相关阅读:
    自定义类似smarty模板
    PHP函数相关知识点
    cookie的使用和设置
    进程通过内核缓存区请求设备I/O的一些事情
    多线程模型和问题
    C10K问题和多进程模型
    node.js----一个httpserver提交和解析get参数的例子
    nodejs解析url参数的三种方法
    node.js http模块和fs模块上机实验·
    c++中的srand()和rand() 转载 自:http://blog.sina.com.cn/s/blog_624c2c4001012f67.html
  • 原文地址:https://www.cnblogs.com/skyell/p/9641082.html
Copyright © 2011-2022 走看看