spider_爬取内涵吧的段子(二级深度爬取)

'''
爬取内涵吧段子所有笑话(带标题,作者)
总结:解码上,使用gbk2312编码的,我们可以采取gbk解码。 不会报错
'''

from fake_useragent import FakeUserAgent
import requests
import chardet
import re
from lxml import etree
import os
import time
# 定义一个url
def neiHan():
num=1
base_url = 'https://www.neihanba.com/dz/'
while True:
base_headers = {
'User-Agent':FakeUserAgent().random
}
base_bytesHtml = requests.get(url=base_url,headers=base_headers).content
# print(base_bytesHtml)
# 判断网页编码格式 返回一个列表
result = chardet.detect(base_bytesHtml)
# print(result)
# 解码 原网站使用的 是gbk2312编码。 我们碰到诸如此类的可以使用,gbk解码。
# 有兴趣的同学可以自行百度两者的关系
base_html = base_bytesHtml.decode('gbk')
# print(base_html)

# 构造树状图
base_html=etree.HTML(base_html)
# 使用xpath提取url列表
urls = base_html.xpath('/html/body/div[1]/div/div[1]/ul/li[*]/h4/a/@href')
# print(urls)
for url in urls:
# print(url)
url = 'https://www.neihanba.com'+url
headers = {
'User-Agent':FakeUserAgent().random
}
# 请求网页
bytesHtml=requests.get(url,headers=headers).content
# 解码
html=bytesHtml.decode('gbk')
# print(html)
# 提取内容(标题) 使用正则
# 定义正则表达式(url)
title = r'<h1>(.*?)</h1>'
# 编译
title = re.compile(title,re.S)
# 正则提取标题
title = re.findall(title,html)
print(title)
# 定义正则提取内容
detail = r'<p>(.*?)</p>'
# 编译
detail = re.compile(detail,re.S)
# 进行提取
detail = re.findall(detail,html)
# # 处理字符串,去掉多余的空格,替换&rdquo为右引号。使用正则sub方法
# detail = re.sub('&ldquo','"',detail[0])
# 处理字符串使用replace方法
detail_list = []
detail=detail[0].replace('&ldquo','"').replace('&rdquo','"').strip()
detail_list.append(detail)
# print(detail)
# print(detail_list)

# 保存成txt文本
dir = os.makedirs("./neibanba")
with open(dir+title[0].txt,'w',encoding='utf-8') as f:
f.write(detail)
# 设置延时
time.sleep(1.5)
# 判断是否有下一页,如果没有循环停止,使用的是尾页判断。
res=base_html.find('<a href="/dz/list_100.html">尾页</a>')
# 如果没有
if res == -1:
break
num+=1
# print(num)
base_url = 'https://www.neihanba.com/dz/list_{}.html'.format(num)

if __name__ == '__main__':
neiHan()
posted @ 2019-06-10 19:18  猫有九命  阅读(235)  评论(0编辑  收藏  举报