• 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()
    人生苦短,我用python!
  • 相关阅读:
    JVM之GC调优
    JVM的栈、堆
    SpringMVC及其HandlerMapping、HandlerInterceptor、HandlerAdapter等组件的原理解析
    静态代理、动态代理和CGLIB,SpringAOP中的代理
    cmd删除文件夹
    vue-router命名视图+路由嵌套
    Vue实现长按事件
    [SparkSQL] hive.exec.max.dynamic.partitions配置不起作用
    Excel分数转为百分数
    Hadoop YARN主资源调度算法
  • 原文地址:https://www.cnblogs.com/YangQingHong/p/10999675.html
Copyright © 2020-2023  润新知