虽然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| ') # 将除了汉字以外的所有字符去掉
整体代码为:
# -*- coding:utf-8 -*-
# 2018/9/13 12:00
import requests
import re
import time
from requests.packages.urllib3.poolmanager import PoolManager
from requests.packages.urllib3.exceptions import InsecureRequestWarning,InsecurePlatformWarning
requests.packages.urllib3.disable_warnings(InsecureRequestWarning)
requests.packages.urllib3.disable_warnings(InsecurePlatformWarning) class Qiubai_spider(object):
"""糗事百科段子爬虫""" def __init__(self):
self.base_url = "https://www.qiushibaike.com/hot/"
self.headers = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; WOW64; Trident/7.0; rv:11.0) like Gecko"}
self.analysis_pattern = re.compile('<div class="content">.*?</div>', re.S)
self.analysis_pattern_t = re.compile(r'<.*?>|&(.*?);|\s| ')
# 第一次解析 <div class ="content" >(.*?)</div>
def send_request(self, url):
"""发送请求"""
time.sleep(2)
try:
response = requests.get(url, headers=self.headers)
return response.content
except Exception, err:
print err def write_file(self, data, page):
"""写入数据"""
with open('qiushiduanzi1.txt', 'a') as f:
filename = "第" + str(page) + "页的段子\n"
print filename
f.write(filename)
for content in data:
second_data = self.analysis_pattern_t.sub('', content)
f.write(second_data)
f.write("\n\n\n") def analysis_data(self, data):
"""数据分析提取"""
analysis_list = self.analysis_pattern.findall(data)
return analysis_list def start_work(self):
"""启动爬虫流程"""
for page in range(1, 10):
# 拼接url
url = self.base_url + "page/" + str(page) + '/' + '.html' # 发送请求
data = self.send_request(url) # 解析数据
analysis_db = self.analysis_data(data) # 写入数据
self.write_file(analysis_db, page) if __name__ == '__main__': tool = Qiubai_spider()
tool.start_work()
糗事爬虫代码
爬取后的效果: