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()

 

posted @ 2018-08-17 15:56  岁月如歌_九  阅读(4803)  评论(0编辑  收藏  举报