2018-10-18 17:33:42 qq_37811638 阅读数 7804
  • Python爬虫应用案例视频课程

    本课程以通俗易懂的方式讲解Python爬虫技术,以案例为导向,手把手的Python爬虫实战教程,让你少走弯路! 课程内容包括:1.爬虫简介,Python爬虫入门、2.基本用法、3.爬虫应用(电影评论数据分析)。教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    2464 人正在学习 去看看 汤小洋

接上一篇文章:Python爬虫(一):编写简单爬虫之新手入门

前言:

上一篇文章,我爬取到了豆瓣官网的页面代码,我在想怎样让爬取到的页面显示出来呀,爬到的数据是html页面代码,不如将爬取到的代码保存到一个文件中,文件命名为html格式,那直接打开这个文件就可以在浏览器上看到爬取数据的效果了。废话不多说,进入正文。

本篇文章:继续介绍另外两种方式来实现python爬虫获取数据,并将python获取的数据保存到文件中。

一、第一种方式:

主要通过爬取百度官网页面数据,将数据保存到文件baidu.html中,程序运行完打开文件baidu.html查看效果。具体代码中有详细的代码解释,相信刚入门的你也能看懂~~

说明一下我的代码环境是python3.7,本地环境是python2.x的可能需要改部分代码,用python3.x环境的没问题。

代码如下:

# -*- coding: utf-8 -*-
import urllib.request
import urllib

# 1、网址url  --百度    
url = 'http://www.baidu.com'

# 2、创建request请求对象
request = urllib.request.Request(url)

# 3、发送请求获取结果
response = urllib.request.urlopen(request)
htmldata = response.read()

# 4、设置编码方式
htmldata = htmldata.decode('utf-8')

# 5、打印结果
print (htmldata)

# 6、打印爬去网页的各类信息
print ("response的类型:",type(response))
print ("请求的url:",response.geturl())
print ("响应的信息:",response.info())
print ("状态码:",response.getcode())

# 7、爬取数据保存到文件
fileOb = open('baidu.html','w',encoding='utf-8')     #打开一个文件,没有就新建一个
fileOb.write(htmldata)
fileOb.close()

在open()方法中如果没有设置编码encoding='utf-8',会报错,原因如下:
在windows下面,新文件的默认编码是gbk,这样的话,python解释器会用gbk编码去解析我们的网络数据流html,
然而html此时已经是decode过的unicode编码,这样的话就会导致解析不了,出现上述问题。
设置encoding='utf-8',打开文件时就按照utf-8格式编码,则顺利运行。

运行结果:

部分截图如下:截取的是第六步中的网页各类信息,第五步打印的数据过多,也已经保存到文件baidu.html中了,所以没有截取。

下图是运行程序之后在本地生成的baidu.html文件

打开此baidu.html文件结果如下图所示:

有没有很神奇是不是和百度页面一模一样^_^,没错,就是这样子的

二、第二种方式:添加特殊情景的处理器

代码如下:

# -*- coding: utf-8 -*-
import urllib.request, http.cookiejar

# 1、网址url  --百度
url = 'http://www.baidu.com'

# 2、创建cookie容器
cj = http.cookiejar.CookieJar()
handle = urllib.request.HTTPCookieProcessor(cj)

# 3、创建1个opener
opener = urllib.request.build_opener(handle)

# 4、给urllib.request安装opener
urllib.request.install_opener(opener)

# 5、使用带有cookie的urllib.request访问网页,发送请求返回结果
response = urllib.request.urlopen(url)
htmldata = response.read()

# 6、设置编码方式
data = htmldata.decode("utf-8")

# 7、打印结果
print (data)

# 8、打印爬去网页的各类信息
print ("response的类型:",type(response))
print ("请求的url:",response.geturl())
print ("响应的信息:",response.info())
print ("状态码:",response.getcode())

# 9、爬取数据保存到文件
fileOb = open('baiduCookie.html','w',encoding='utf-8')     #打开一个文件,没有就新建一个
fileOb.write(data)
fileOb.close()

为了区别第一种生成的文件baidu.html,这里我将第二种生成的文件命名为baiduCookie.html

这种方式结果和第一种一样,只是代码不同,所以下面不在赘述,结果见第一种即可。

喜欢我的文章的可以关注哦,有问题的可以提出来,互相交流,互相学习^_^

 

觉得不过瘾,看下一篇文章。

接下一篇文章:Python爬虫(三):python抓取网页中的图片到本地

2019-12-04 22:56:52 weixin_42365530 阅读数 271
  • Python爬虫应用案例视频课程

    本课程以通俗易懂的方式讲解Python爬虫技术,以案例为导向,手把手的Python爬虫实战教程,让你少走弯路! 课程内容包括:1.爬虫简介,Python爬虫入门、2.基本用法、3.爬虫应用(电影评论数据分析)。教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    2464 人正在学习 去看看 汤小洋

最近迷上了Python爬虫,我们的hadoop课程也正好涉及到了这个内容,所以就想结合课程内容(爬取京东手机评论https://item.jd.com/100003060627.html#crumb-wrap)写一篇关于python爬虫到数据可视化的完整流程

打开网站https://item.jd.com/100003060627.html#crumb-wrap我们要爬取该手机的评论信息,就要先找到“我们点击查看评论时,浏览器向服务器请求来的文件”在该文件中有我们需要的url地址和求头(请求头包括referer:重定向 和 user-agent:用户代理),浏览器都会有一些反爬虫的措施,所以需要使用该请求头去模拟浏览器向服务器请求数据。至于怎么找到我们需要的文件,博主只能说:这需要一些前端的知识和自己的经验,爬虫做多了 额…不对,这样不太好,爬虫是有些偏灰暗的,我是说熟能生巧啊。可以先看一下文件的Preview,如下即为我们需要的信息文件,然后点击Headers先复制我们需要的信息到编译器中,为我们待会写代码时准备:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

获取并筛选数据

拿到我们需要的url地址和请求头后,先分析一下url地址,主要是它的后半部分,它是由字符串拼接而成的,比如这里的url地址:https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv21252&productId=100003060627&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1
在这里**page=**后面跟的就是第几页评论的信息(数据),不信你点击第二页评论时page=后面就是1&pageSize=10&isShadowSku=0&fold=1,由0变为了1(感觉在侮辱自己的智商(艹皿艹)),由此我们可以将url地址切割为两部分,将变化的数据用变量表示,然后再将两部分拼接得到最终的url地址,我们就可以通过控制变量来获取对应的数据量了,如下为切割和拼接的过程和结果

#切割后第一部分
url_header="https://sclub.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98vv19450&productId=100003060627&score=0&sortType=5&page="
#切割后第二部分
url_tail="&pageSize=10&isShadowSku=0&rid=0&fold=1"
#拼接得到最终url地址(后面用循环改变page的值,此处加1,即从第二页开始获取数据,也可以不加1)
url_mate20=url_header + str(page+1) + url_tail

现在正式开始搬砖了,先导入我们需要用到的两个库,也可以叫包、模块

import requests
import json

利用请求头和拼接得到的最终url,循环请求每一条评论数据,并将请求到的数据转化格式为json格式保存为本地的txt文件,如下我保存到自己电脑D:\python_data目录下

    for page in range(20):
        url_tail="&pageSize=10&isShadowSku=0&rid=0&fold=1"
        # 拼接得到最终url,并请求数据(得到键值对格式(字典)的数据)
        url_mate20=url_header + str(page+1) + url_tail
        res=requests.get(url_mate20,headers=headers)

        # 用json.loads将数据转化格式为json格式
        data=json.loads(res.text[27:-2])
        comment=(data['comments'])

        # 将数据遍历保存到本地的.txt文件中,
        for i in comment:
            # 注意带参数"a",如果是w就会覆盖原有内容,这样子你只能得一条评论
            honor20i_text=open('D:\\python_data\\honor20i_text.txt','a')
            honor20i_text.write('%s\n'%i['content'])
            honor20i_text.close()

此时运行程序会在指定目录下生成一个txt文件,打开可看见即为我们获取到的评论数据,看起来有点乱,可以在请求的时候自己做一下格式美化,后面我要将获取到的txt数据可视化(词云),所以这里就不用做美化了啊
在这里插入图片描述

数据可视化(词云形式,激动ヾ(✿゚▽゚)ノ)

同样先到包

import jieba
from wordcloud import WordCloud
import matplotlib.pyplot as plt #可视化包

下面读取我们获取到的txt文件内容,再使用jieba来处理剪切我们爬取的文本内容,继续处理对剪过的文本以空格拼接起来,然后就是利用matplotlib包设置一下显示的字体样式和保存显示结果了

import jieba
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt #可视化包

    #读取爬虫保存下载的数据
    file_text = open('D:\\python_data\\honor20i_text.txt','r').read()

    #再使用jieba来处理剪切我们爬取文本内容
    cut_text = jieba.cut(file_text)

    #继续处理对剪过的文本以空格拼接起来,注意一下这里“”有空格的
    result = " ".join(cut_text)

    wc_cloud = WordCloud(
        font_path='D:\python_data\\pzh.ttf',     #字体的路径
        background_color='black',   #背景颜色
        width=1200,
        height=600,
        max_font_size=150,            #字体的大小
        min_font_size=30,			  #字体的大小
        max_words=10000
    )
    wc_cloud.generate(result)
    wc_cloud.to_file('D:\\python_data\\LingDucloud.png')    #图片保存

    #图片展示
    plt.figure('凌度img')   #图片显示的名字
    plt.title('JD_mate20')
    plt.imshow(wc_cloud)
    plt.axis('off')
    plt.show()

注意这里用到了.ttf字体包,没有字体包的可以在评论区留言,博主我分享给你呀,我还是有几个字体包的( ̄︶ ̄)↗

font_path='D:\python_data\\pzh.ttf'

在这里插入图片描述
如下为运行后的可视化词云效果,字体越大越明显的词汇说明在评论内容中出现的次数就越多,此时在指定的路径目录下也会生成相应的图片
在这里插入图片描述
在这里插入图片描述
下面为全部源码,将数据获取和数据可视化分别写成两个方法,在main中分别调用就不用新建两个python文件啦。哪里还不太懂,或者有什么问题(包括和我获取.ttf字体包)欢迎在留言区留下你的脚印哦。


import requests
import json

#数据爬取方法
def gain_data():
    #请求头(包括referer:重定向(反爬虫) user-agent:用户代理)
    headers={
        'referer':'Referer: https://item.jd.com/100003060627.html',
        'user-agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 '
                     '(KHTML, like Gecko) Chrome/75.0.3770.80 Safari/537.36'
    }
    #url地址
    url_header="https://sclub.jd.com/comment/productPageComments.action?callback=" \
               "fetchJSON_comment98vv19450&productId=100003060627&score=0&sortType=5&page="

    for page in range(20):
        url_tail="&pageSize=10&isShadowSku=0&rid=0&fold=1"
        # 拼接得到最终url,并请求数据(得到键值对格式(字典)的数据)
        url_mate20=url_header + str(page+1) + url_tail
        res=requests.get(url_mate20,headers=headers)

        # 用json.loads将数据转化格式为json格式
        data=json.loads(res.text[27:-2])
        comment=(data['comments'])

        # 将数据遍历保存到本地的.txt文件中,
        for i in comment:
            # 注意带参数"a",如果是w就会覆盖原有内容,这样子你只能得一条评论
            honor20i_text=open('D:\\python_data\\honor20i_text.txt','a')
            honor20i_text.write('%s\n'%i['content'])
            honor20i_text.close()


#词云可视化方法
def mate20_view():
    import jieba
    from wordcloud import WordCloud
    import matplotlib.pyplot as plt #可视化包

    #读取爬虫保存下载的数据
    file_text = open('D:\\python_data\\honor20i_text.txt','r').read()

    #再使用jieba来处理剪切我们爬取文本内容
    cut_text = jieba.cut(file_text)

    #继续处理对剪过的文本以空格拼接起来,注意一下这里“”有空格的
    result = " ".join(cut_text)

    wc_cloud = WordCloud(
        font_path='D:\python_data\\pzh.ttf',     #字体包的路径
        background_color='black',   #背景颜色
        width=1200,
        height=600,
        max_font_size=150,            #字体的大小
        min_font_size=30,			  #字体的大小
        max_words=10000
    )
    wc_cloud.generate(result)
    wc_cloud.to_file('D:\\python_data\\LingDucloud.png')    #图片保存

    #图片展示
    plt.figure('凌度img')   #图片显示的名字
    plt.title('JD_mate20')
    plt.imshow(wc_cloud)
    plt.axis('off')
    plt.show()

if __name__ == '__main__':
    mate20_view()

文章到这里就结束啦,感谢参考:
https://www.jb51.net/article/154261.htm
https://blog.csdn.net/weixin_42946604/article/details/88079475

关于博主

这是一篇很基础的关于python爬虫的博客文章,大佬看见了一定要在评论区留下宝贵的建议脚印呀!大二的时候就学习过Python这方面的知识了,那时候没什么兴趣,就没有好好学┭┮﹏┭┮,现在也是还在自学中,也看了很多大佬的文章,受益匪浅。最后告诉一下小同学,如果是计算机类、编程类专业并且要走专业路线的话,一定要好好学习数学,今后的人工智能、大数据、数据建模你将会感受到数学的重要性,说到这里真想给自己两jiao(つД`)过去两年怎么不好好学高数、线性代数、概率论、离散数学和算法,精神上再给自己一jiao!


  o    _______________
 /\_  _|             |
_\__`[_______________|  
] [ \, ][         ][
2018-08-16 14:02:03 lmseo5hy 阅读数 10621
  • Python爬虫应用案例视频课程

    本课程以通俗易懂的方式讲解Python爬虫技术,以案例为导向,手把手的Python爬虫实战教程,让你少走弯路! 课程内容包括:1.爬虫简介,Python爬虫入门、2.基本用法、3.爬虫应用(电影评论数据分析)。教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    2464 人正在学习 去看看 汤小洋

Python爬虫是用Python编程语言实现的网络爬虫,主要用于网络数据的抓取和处理,相比于其他语言,Python是一门非常适合开发网络爬虫的编程语言,大量内置包,可以轻松实现网络爬虫功能。

Python爬虫可以做的事情很多,如搜索引擎、采集数据、广告过滤等,Python爬虫还可以用于数据分析,在数据的抓取方面可以作用巨大!

Python爬虫架构组成

1. URL管理器:管理待爬取的url集合和已爬取的url集合,传送待爬取的url给网页下载器;

2. 网页下载器:爬取url对应的网页,存储成字符串,传送给网页解析器;

3. 网页解析器:解析出有价值的数据,存储下来,同时补充url到URL管理器。

Python爬虫工作原理

Python爬虫通过URL管理器,判断是否有待爬URL,如果有待爬URL,通过调度器进行传递给下载器,下载URL内容,并通过调度器传送给解析器,解析URL内容,并将价值数据和新URL列表通过调度器传递给应用程序,并输出价值信息的过程。

Python爬虫常用框架有:

grab:网络爬虫框架(基于pycurl/multicur);

scrapy:网络爬虫框架(基于twisted),不支持Python3;

pyspider:一个强大的爬虫系统;

cola:一个分布式爬虫框架;

portia:基于Scrapy的可视化爬虫;

restkit:Python的HTTP资源工具包。它可以让你轻松地访问HTTP资源,并围绕它建立的对象;

demiurge:基于PyQuery的爬虫微框架。

Python爬虫应用领域广泛,在网络爬虫领域处于霸主位置,Scrapy、Request、BeautifuSoap、urlib等框架的应用,可以实现爬行自如的功能,只要您数据抓取想法,Python爬虫均可实现!

2017-09-16 10:14:49 zhaobig 阅读数 4431
  • Python爬虫应用案例视频课程

    本课程以通俗易懂的方式讲解Python爬虫技术,以案例为导向,手把手的Python爬虫实战教程,让你少走弯路! 课程内容包括:1.爬虫简介,Python爬虫入门、2.基本用法、3.爬虫应用(电影评论数据分析)。教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    2464 人正在学习 去看看 汤小洋
Python Scrapy爬虫数据写入操作

在我们写完一个爬虫项目,得到了一大堆的数据,为了以后的分析和使用,我们需要把我们得到的数据进行保存。保存数据的方式主要有:保存到数据库,保存到CSV文件,保存为JSON文件。
保存到数据库中分为同步和异步的方式:

一般小的数据,我们可以选择,同步保存数据库:

首先先准备好数据库文件和数据表

操作在pipelines.py文件中完成
将item写入数据库
import MySQLdb
class MysqlPipeine(object):

    def __init__(self):
        self.conn = MySQLdb.connect(
                    host = 'localhost',
                    # mysql默认端口号3306
                    port = 3306,
                    user = 'root',
                    passwd = '123456',
                    db = 'db_name',
                    use_unicode = True,
                    charset = 'utf8'
        )
        self.cursor = self.conn.cursor()
    
    
    # 处理item的函数
    def process_item(self, item, spider):
    
    # 准备sql语句
        sql = 'insert into table_name(字段名)VALUES (字段数据,即item对象)'
        self.cursor.execute(sql)
        self.conn.commit()
    
    def close_spider(self, spider):
        self.cursor.close()
        self.conn.close()

如果数据量较大,异步写入数据库会更高效:
同样操作在我们的pipelines文件中,但在操作之前,需要配置我们的setting文件,在其中添加我们的数据
# 自己配置一些项目信息
# 数据库配置
MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = 3306
MYSQL_USER = 'root'
MYSQL_PASSWD = '123456'
MYSQL_CHARSET = 'utf8'
MYSQL_DBNAME = 'db_name'
然后在pipelines中进行我们异步写入数据库的操作:

# 将item写入数据库
import MySQLdb
class MysqlPipeine(object):

    def __init__(self):
        self.conn = MySQLdb.connect(
                host = 'localhost',
                # mysql默认端口号3306
                port = 3306,
                user = 'root',
                passwd = '123456',
                db = 'db_name',
                use_unicode = True,
                charset = 'utf8'
    )
        self.cursor = self.conn.cursor()

    # 处理item的函数
    def process_item(self, item, spider):
    # 准备sql语句
        sql = 'insert into table_name(字段名)VALUES (字段数据,即item对象)'
        self.cursor.execute(sql)
        self.conn.commit()


    def close_spider(self, spider):
        self.cursor.close()
        self.conn.close()
如果数据量较大,异步写入数据库会更高效:
同样操作在我们的pipelines文件中,但在操作之前,需要配置我们的setting文件,在其中添加我们的数据

# 自己配置一些项目信息
# 数据库配置

MYSQL_HOST = '127.0.0.1'
MYSQL_PORT = 3306
MYSQL_USER = 'root'
MYSQL_PASSWD = '123456'
MYSQL_CHARSET = 'utf8'
MYSQL_DBNAME = 'db_name'
然后在pipelines中进行我们异步写入数据库的操作:

from twisted.enterprise import adbapi

from MySQLdb import cursors

class MysqlTwistedPipeline(object):
    @classmethod
    # 这个函数会自动调用
    def from_settings(cls, settings):
        # 准备好连接数据库需要的参数
        db_params = dict(
            host=settings["MYSQL_HOST"],
            port=settings["MYSQL_PORT"],
            user=settings["MYSQL_USER"],
            passwd=settings["MYSQL_PASSWD"],
            charset=settings["MYSQL_CHARSET"],
            db=settings["MYSQL_DBNAME"],
            use_unicode=True,
            # 指定游标类型
            cursorclass=cursors.DictCursor
        )
        # 创建连接池
        # 1.要连接的名称  2.连接需要的参数
        db_pool = adbapi.ConnectionPool('MySQLdb', **db_params)
        # 返回当前类的对象,并且把db_pool赋值给该类的对象
        return cls(db_pool)

    def __init__(self, db_pool):
        # 赋值
        self.db_pool = db_pool
        # 处理item函数

    def process_item(self, item, spider):
        # 把要处理的事件进行异步处理
        # 1.要处理的事件函数
        # 2.事件函数需要的参数
        query = self.db_pool.runInteraction(self.do_insert, item)
        # 执行sql出现错误信息
        query.addErrback(self.handle_error, item, spider)
        # 错误的原因

    def handle_error(self, failure, item, spider):
        print failure
    # 处理插入数据库的操作
    # cursor该函数是连接数据库的函数,并且放在异步去执行,cursor执行sql语句
    def do_insert(self, cursor, item):
        # 1.准备sql语句
        sql = 'insert into table_name(表中各个字段名)VALUES (各个字段对应的数据item)'
        # 2.用cursor游标执行sql
        cursor.execute(sql)

写入CSV文件的操作:
同样操作在我们的pipelines.py文件中进行
# 写入csv文件
import csv
import codecs
class SaveCSVFile(object):

    def __init__(self):
        file_handle = codecs.open('name.csv', 'w', encoding='utf-8')
        # 1. 创建csv文件
        self.csv = csv.writer(file_handle)
        self.csv.writerow(表头的信息)

    def process_item(self, item, spider):
        self.csv.writerow(表头信息所对应的每个item对象)
        return item

    def __del__(self):
        # 关闭文件
        self.file_handle.close()
写入json文件:
import json
class JsonPipeline(object):

    def __init__(self):
        self.file_handle = codecs.open('name.json', 'w', encoding='utf-8')

    def process_item(self, item, spider):
        data = json.dumps(dict(item), ensure_ascii=False) + "\n"
        self.file.write(data)
        return item

    def __del__(self):
        # 关闭文件
        self.file_handle.close()

在我们完成pipelines中的函数重写后,一定要记得在setting文件中配置,以确保其能正常执行。


如果同时在pipelines中进行多种方式的写入的话,切记要在process_item函数中返回item,即return item
还有一种简单的保存csv / json文件的方法:
在编辑器命令行输入:scrapy crawl spider - o name.json / csv - s FEED_EXPROT_ENCODING = UTF8
FEED_EXPORT_ENCODING = UTF8指保证文件中的中文正常显示

2019-12-01 09:24:24 weixin_45919928 阅读数 28
  • Python爬虫应用案例视频课程

    本课程以通俗易懂的方式讲解Python爬虫技术,以案例为导向,手把手的Python爬虫实战教程,让你少走弯路! 课程内容包括:1.爬虫简介,Python爬虫入门、2.基本用法、3.爬虫应用(电影评论数据分析)。教学全程采用笔记+代码案例的形式讲解,通俗易懂!!!

    2464 人正在学习 去看看 汤小洋

立即学习:https://edu.csdn.net/course/play/9348/195855?utm_source=blogtoedu

1、安装Redis库:pip install Redis

2、导入Redis库:import redis

连接redis 

3、存储数据到redis里面

      def save_to_redis(data):

            config={

                     'host':'192.168.2.30',

                      'port':6370,

                      'charset':'utf8'

}

          r=redis.Redis(**config)

     for  item in data;

        r.lpush('jobs',item)

 

#从redis里面读取数据

 

没有更多推荐了,返回首页