zoukankan      html  css  js  c++  java
  • 好段子网站任意页数爬取

    #使用Xpath方式爬取好段子
    #http://www.haoduanzi.com/category/?1-1.html 从第二页开始1-2 1-3
    
    import urllib.parse
    import urllib.request
    from lxml import etree
    import time
    import json
    
    #写个列表 parse_content方法中使用
    item_list = []
    
    #构建请求函数
    def handle_request(url,page):
        #构造请求头
        headers = {
        "User-Agent": 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
    }
        #注意 拼接url  新姿势
        url = url % page
        #print(url)
        request = urllib.request.Request(url=url,headers=headers)
        return request
    
    #定义解析服务器返回内容的函数
    def parse_content(content):
        #生成对象
        tree = etree.HTML(content)
        #注意此处有一个重点是
        # <li>标签中有不含属性的,有含属性的,要过滤不含属性的 li[not(@class)]
        #注意:
        #双斜杠//代表下面所有位置的标签
        #.//代表当前块内的标签寻找
        div_list = tree.xpath('//div[@class="left"]/ul[@class="list-box"]/li[not(@class)]')
        # print(len(div_list))
        # exit()
        #循环li列表
        for odiv in div_list:
            #获取标题
            title = odiv.xpath('.//h2[@class="s2"]/text()')
            # print(title)
            # exit()
            #内容
            text_lt = odiv.xpath('.//div[@class="content"]/a/p/text()')
            text = '
    '.join(text_lt)
            # print(text)
            # print(len(text))
            # print("*"*60)
            # exit()
            item ={
                '标题':title,
                '内容':text
            }
            #将内容写入到列表中
            item_list.append(item)
    #主函数
    def main():
        start_page = int(input("请输入想要开始爬取的页数(从第2页开始):"))
        end_page = int(input("请输入想要结束的页数:"))
        url = "http://www.haoduanzi.com/category/?1-%s.html"
        for page in range(start_page,end_page +1):
            print("开始爬取第%s页"% page)
            #构建请求
            request = handle_request(url,page)
            content = urllib.request.urlopen(request).read().decode()
            #print(content)
            parse_content(content)
            time.sleep(2)
            #写入到文件中
            #string = json.dumps(item_list,ensure_ascii=False)
            #此处输出为一个大字典
            with open("duanzi.html","w",encoding="utf8") as fp:
                fp.write(str(item_list))
            print("第%s页爬取结束"% page)
        print("爬取任务结束.....")
    
    if __name__== '__main__':
        main()

    作者:求知鱼

    -------------------------------------------

    个性签名:你有一个苹果,我有一个苹果,我们交换一下,一人还是只有一个苹果;你有一种思想,我有一种思想,我们交换一下,一个人就有两种思想。

    如果觉得这篇文章对你有小小的帮助的话,记得在右下角点个“推荐”哦,博主在此感谢!

    独学而无友,则孤陋而寡闻,开源、分享、白嫖!

  • 相关阅读:
    echarts的整理
    socket.io做一个简单的聊天案例
    WebSocket通信随笔
    接口返回的二维码图片,如何处理显示(axios处理后台返回图片流格式数据)
    小程序封装request请求
    一站式解决Vue插件开发,上传Github,Npm包发布
    微信公众号链接处理问题
    git常用命令
    vscode 常用配置
    项目中报错Cannot read property 'getAttribute' of undefined解决
  • 原文地址:https://www.cnblogs.com/Qiuzhiyu/p/12182850.html
Copyright © 2011-2022 走看看