zoukankan      html  css  js  c++  java
  • python 爬虫与数据可视化--数据提取与存储

    一、爬虫的定义、爬虫的分类(通用爬虫、聚焦爬虫)、爬虫应用场景、爬虫工作原理(最后会发一个完整爬虫代码)

    二、http、https的介绍、url的形式、请求方法、响应状态码

      url的形式:

      

      请求头:

      

      常见响应状态码(可利用响应状态码判断响应状态assert response.status_code == 200):

      

    三、数据请求,获取响应(requests模块,详细使用方法api文档)

      中文文档api:http://docs.python-requests.org/zh_CN/latest/index.html

      发送请求格式:requests.get(url,headers=headers,timeout=5)   #get方式

             requests.post("http://www.baidu.com/", data = data,headers=headers)   #post大文本传输,不限制长度,post更安全,data参数为字典

             session = requests.session()  session.get(url,headers)  

      cookies与session应用:cookies保存在浏览器端、session保存在服务端,利用session类保持会话连接请求页面,但缺点不能请求多、快容易被识别

    四、数据提取与分类(json模块、lxml的etree模块)

      通常响应数据分为结构化数据与非结构化数据,结构化数据为json格式等,非结构化数据为html页面等

      结构化数据多为json格式,利用浏览器抓包工具,找到对应响应的Json字符串,在转化为python数据类型(字典)

      非结构化数据多为html页面直接抓取,利用xpath节点选择,抓取对应数据(需掌握xpath元素定位、配合工具Chrome插件 XPath Helper)

    五、数据的保存

      利用mongodb数据库来存爬取的数据(安装与部署请见mongodb的安装与配置)或直接write保存到本地

      

    五、糗事百科html数据提取与保存代码

    import requests
    from lxml import etree
    from pymongo import MongoClient
    
    client = MongoClient("127.0.0.1",27017)
    collection = client["duanzi"]["qiubai"]
    
    
    def get_url_list():  # 1.url的规律,构造一堆url出来
        url_list = []
        url_temp = "https://www.qiushibaike.com/8hr/page/{}/"
        for i in range(1, 14):
            url = url_temp.format(i)
            url_list.append(url)
        return url_list
    
    
    def parse_url(url):
        headers = {
            "User-Agnet": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36"}
        r = requests.get(url, headers=headers, timeout=5)
        hmtl_str = r.content.decode()
        html = etree.HTML(hmtl_str)  # 使用etree处理,得到elemnet对象,能够使用xpath方法
        return html
    
    
    def get_content_list(html): # 3.提取数据
        div_list = html.xpath("//div[@id='content-left']/div")
        content_list = []
        for div in div_list:
            item = {}
            item["author_img"] = div.xpath("./div[@class='author clearfix']//img/@src")
            if len(item["author_img"]) > 0:  # 获取用户的图像图片
                item["author_img"] = "https:" + item["author_img"][0]
            else:
                item["author_img"] = None
            item["author_name"] = div.xpath("./div[@class='author clearfix']//h2/text()")
            if len(item["author_name"]) > 0:  # 获取用户名字
                item["author_name"] = item["author_name"][0].strip()
            else:
                item["author_name"] = None
            # 获取性别
            item["author_gender"] = div.xpath("./div[@class='author clearfix']/div/@class")
            if len(item["author_gender"]) > 0:
                item["author_gender"] = item["author_gender"][0].split(" ")[-1].replace("Icon", "")
            else:
                item["author_gender"] = None
            # 获取年龄
            item["author_age"] = div.xpath("./div[@class='author clearfix']/div/text()")
            if len(item["author_age"]) > 0:
                item["author_age"] = item["author_age"][0]
            else:
                item["author_age"] = None
            #获取段子的正文
            item["content"] = div.xpath(".//div[@class='content']/span/text()")
            item["content"] = [i.strip() for i in item["content"]]
            #提取点赞的的数量
            item["stats_vote"] = div.xpath(".//span[@class='stats-vote']/i/text()")
            if len(item["stats_vote"])>0:
                item["stats_vote"] = item["stats_vote"][0]
            else:
                item["stats_vote"] = None
            #提取评论数量
            item["stats_comments"] = div.xpath(".//span[@class='stats-comments']//i/text()")
            if len(item["stats_comments"])>0:
                item["stats_comments"] = item["stats_comments"][0]
            else:
                item["stats_comments"] = None
    
            #提取正文中的文中的图片
            item["content_img"] = div.xpath("./div[@class='thumb']//img/@src")
            if len(item["content_img"])>0:
                item["content_img"] = "https:"+item["content_img"][0]
            else:
                item["content_img"] = None
    
            content_list.append(item)
        return content_list
    
    def save_content_list(content_list): #保存
        for content in content_list:
            print(content)
            collection.insert(content)
            print("*"*100)
    
    def run():
        # 1.url的规律,构造一堆url出来
        url_list = get_url_list()
        # 2.遍历url_list,发送请求,获取响应
        for url in url_list:
            html = parse_url(url)
            # 3.提取数据
            content_list = get_content_list(html)
            # 4.保存
            save_content_list(content_list)
    
    if __name__ == '__main__':
        run()
  • 相关阅读:
    docker的网络服务
    想真正了解JAVA设计模式看着一篇就够了。 详解+代码实例
    再问你Java内存模型的时候别再给我讲堆栈方法区
    ssh爆破脚本
    ecshop3.0.0注入
    zabbix 安装配置以及漏洞检测脚本
    代理爬取
    selenium2使用记录
    初级AD域渗透系列
    用ftplib爆破FTP口令
  • 原文地址:https://www.cnblogs.com/xjx767361314/p/9493773.html
Copyright © 2011-2022 走看看