[爬虫]用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) + "页的段子\n" 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("\n\n\n") 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()
爬取后的效果:
数据驱动变革-云将skyell。用Flask+Nginx+uWsgi搭建的个人博客:http://www.skyell.cn/