• Python网络爬虫



     

    Python网络爬虫

     

    作者:songyifei

    归档:学习笔记

    2019/02/26

    快捷键:

    Ctrl + 1    标题1

    Ctrl + 2    标题2

    Ctrl + 3    标题3

    Ctrl + 4    实例

    Ctrl + 5    程序代码

    Ctrl + 6    正文

    格式说明:

    蓝色字体:注释

    黄色背景:重要

    绿色背景:注意


    第1章   Python爬虫的分类

    1.1 通用爬虫:

    通用爬虫是搜索引擎BaiDu Google YaHoo等,抓取的重要组成部分,主要目的是将互联网上的网页下载到本地,形成一个互联网内容的镜像备份。

    1.2 聚焦爬虫

    是根据指定的需求抓取网络上的数据

    1.3 Robots.txt协议

    自己的门户网站中的指定页面中的数据不想让爬虫程序取到的化,那么则可以通过编写一个robots.txt的协议文件来约束爬虫程序的数据爬取

    1.4 反爬虫

    门户网站通过相应的策略和技术手段,放置爬虫程序进行网站数据的爬取

    1.5 反反爬虫

    爬虫程序通过相应的策略和技术的手段,破解门户网站的反爬虫手段,从而爬取到相应的数据

     

    第2章 什么是Jupyter Notebook

    2.1 简介

    Jupyter Notebook是基于网页的用于交互式计算的应用程序,期可被应用用全过程编码开发,文档编写,运行代码和展示结果

     

    Jupyter Notebook的主要特点

    1. 编写时具有语法高亮、缩进、tab补全的功能
    2. 可直接通过浏览器运行代码,同时在代码块下放展示运行的结果
    3. 对代码编写说明文档或语句时,支持Markdown语法

    2.2 安装

    安装前提:

    安装Jupter Noteboo的前提需要安装python3.3版本或2.7以上的版本

    使用Anaconda安装

        通过安装Anacida来解决Jupter NoteBoo的安装问题

        官方下载地址: www.anaconda.com/download 自行下载,傻瓜式安装,默认配置环境变量

    运行Jupyter Notebook

        Jupyter notebook

     

    2.3 使用介绍

     

    常用快捷键

        向下插入一个cell b

        向上插入一个cell a

    将cell的类型切换成Markdown类型 m

    将cell的类型切换成code类型   y

    运行  shift + enter

    帮助文档 Shift + Tab

    补全 tab

    第3章 网络爬虫模块

    3.1 Urlib

    Python中自带的一个基于爬虫的模块。

    作用:可以使用代码模拟浏览器发起请求.request parse

    使用流程:

        指定url

        发起请求

        获取页面数据

        持久化存储

    实例3-1  需求 爬取搜狗首页数据

    #需求爬取搜狗首页

    import urllib.request

    #1.指定url

    url = 'https://www.sogou.com/'

    #2.发请求,urlopen可以根据指定的url发起请求,且返回一个响应对象

    response = urllib.request.urlopen(url=url)

    #3.获取页面数据:read函数返回的就是响应对象中存储的页面数据(byte)

    page_text = response.read()

    #4.持久化存储

    with open('./sogou.html','wb') as fp:

        fp.write(page_text)

    print('写入数据成功')

     

    #需求:爬取指定词条所对应的页面数据

    import urllib.request

    import urllib.parse

    #指定url

    url =  'https://www.sogou.com/web?query='

    #url的特性:url不可以存在非ASCII编码的字符数据

    word = urllib.parse.quote('范冰冰')

    url += word #有效的url

    #发送请求

    response = urllib.request.urlopen(url=url)

     

    #获取页面数据

    page_text = response.read()

    print(page_text)

     

    #将获取的数据做持久化存储

    page_text = response.read()

    with open('fanbingbing.html','wb') as fp:

        fp.write(page_text)

    print('写入成功')

     

     

    3.2 反爬机制

    -反爬虫机制:网站会检查请求的UA,如果发现请求的UA是爬虫程序,则拒绝提供网站数据

        -User-Agent(UA):请求载体的身份标识

        -反反爬机制:伪装爬虫程序请求的UA,

    实例3-2  UA伪装

    import urllib.request

    url = 'http://www.baidu.com/'

    #UA伪装

    #1.自制定一个请求的对象

    headers = {

        #存储任意的请求头信息

        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'

        }

    #该请求对象的UA进行了成功的伪装

     

    request = urllib.request.Request(url=url,headers=headers)

    #2.针对自制定的请求对象发起请求

    response = urllib.request.urlopen(request)

    print(response.read())

     

    3.3 Post请求

    import urllib.request

    import urllib.parse

    #指定url

    url = 'https://fanyi.baidu.com/sug'

    #post请求携带的参数进行处理 流程:

    #1.将POST 请求参数封装到字典

    data = {

        'kw':'西瓜'

        }

    #2。使用parse模块中的urlencode(返回值类型为str)进行编码处理

    data = urllib.parse.urlencode(data)

    type(data)

    #3.将步骤2的编码结果转换成byte类型

    data  = data.encode()

    #2.发起post请求:urlopen函数的data参数表示的就是经过处理之后的post请求携带的参数

    response = urllib.request.urlopen(url=url,data=data)

    response.read()

     

     

    3.4 Urllib操作

    3.4.1 代理操作

    什么是代理:代理就是第三方代替本体处理相关

    代理分类:

        正向代理:代理客户端获取数据,正向代理是为了保护客户端防止被追究责任

        反响代理:代理服务端提供数据,反向代理为了保护服务器或负载均衡

    3.5 Requests模块

    1、 什么是requests模块

    Python原生一个基于网络请求的模块,模拟浏览器发起请求。

    2、 为什么要使用requests模块

    1. 自带处理url编码,
    2. 自动处理post请求的参数urlencode()
    3. 简化Cookie的代理的操作

    创建一个cookiejar对象

    创建一个handler对象

    创建一个openrner

     

    创建一个handler对象,代理IP和端口封装到该对象

    创建openner对象

    3.requests如何被使用

    安装:pip install requests

    使用流程:

    1. 指定url
    2. 使用requests模块发起请求
    3. 获取响应数据
    4. 进行持久化存储

    3.6 基于requests模块

    实例3-3  —爬取搜狗首页

    import requests

    url = 'https://www.sogou.com/'

    #发起get请求:get 方法会返回请求成功后的响应对象

    response = requests.get(url=url)

    #获取响应中的数据值,text可以获取响应对象中的字符串形式页面的数据

    page_data = response.text

    print(page_data)

    #持久化操作

    with open('./sogou.html','w',encoding='utf-8') as fp:

        fp.write(page_data)

       

    实例3-4  Response对象中其他重要的属性

    #response对象中其他重要的属性

    import requests

    url = 'https://www.sogou.com/'

    #发起get请求:get 方法会返回请求成功后的响应对象

    response = requests.get(url=url)

    #获取响应中的数据值,text可以获取响应对象中的字符串形式页面的数据

    #content获取的是response对象中二进制类型的数据

    # print (response.content)

     

    #返回一个状态码

    #print(response.status_code)

     

    #返回相应头信息

    # print(response.headers)

     

     

    #获取请求的url

    print(response.url)

    实例3-5  Requests如何请求携带参数的get请求

    -方式一

     

    方式二

     

    实例3-6  Requsts模块get请求自定义请求头信息

    #自定义请求头信息

    import requests

     

    url = 'https://sogou.com/web'

     

    #将参数封装到字典中

    params = {

         'query':'周杰伦',

        'ie':'utf-8'

    }

    #自定义请求头信息

    headers = {

        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'

    }

    response = requests.get(url=url,params=params,headers=headers)

    response.status_code

    实例3-7  基于requests模块发起的post请求

    #基于requests模块发起的post请求

     #- 需求:登陆豆瓣网,获取登陆成功后的页面数据

    import requests

    url = 'https://accounts.douban.com/login'

    #封装post请求的参数

    data = {

        'source':'movie',

        'redir':'https://movie.douban.com/',

        'form_email':'18401747334',

        'form_password':'fei@163.com',

        'login':'登录',

    }

    #自定义请求头信息

    headers = {

          'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'

    }

    #发起post请求

    respomse = requests.post(url=url,data=data,headers=headers)

    #获取响应对象中的页面数据

    page_text = respomse.text

    #持久化

    with open('./douban.html','w',encoding='utf-8') as fp:

    fp.write(page_text)

    实例3-8  Requests模块ajax的get请求、

    #基于ajax的get请求

    import requests

    url = 'https://movie.douban.com/j/chart/top_list?'

    #封装ajax的get请求中携带的参数

    params = {

        'type': '13',

        'interval_id': '100:90',

        'action': '',

        'start': '10',

        'limit': '20'

    }

    #请求头信息

    headers = {

          'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'

    }

    respomse = requests.get(url=url,params=params,headers=headers)

    print(respomse.text)

     

    实例3-9  基于ajax的post请求

     

    #基于ajax的post请求

    #需求:爬取肯德基城市餐厅位置数据

    import requests

    #指定url

    post_url = 'http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'

    #post请求的参数

    data = {

        'cname': '',

        'pid': '',

        'keyword': '杭州',

        'pageIndex': '1',

        'pageSize': '10'

    }

    #自定义请求头

    headers = {

          'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'

    }

    #发起基于ajax的post请求

    response = requests.post(url=post_url,headers=headers,data=data)

    response.text

    3.7 Requests模块综合学习

    ## 获取前3页

    import requests

    import os

     

    #创建文件夹

    if not os.path.exists('./pages'):

        os.mkdir('./pages')

       

    word = input('enter a word:')

    #动态指定页码的范围

    start_pagenum = int(input('enter a start pageNum:'))

    end_pageNum = int(input('enter a end pageNum:'))

    #请求头信息

    headers = {

          'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36'

    }

    #指定url,设计成一个具有通用的url

    url = 'https://zhihu.sogou.com/zhihu'

    for page in range(start_pagenum,end_pageNum+1): 

        param = {

            'query':word,

            'page':page,

            'ie':'utf-8'

        }

        response = requests.get(url=url,params=params,headers=headers)

        #获取相应中的页面数据(指定页面(page))

        page_text = respomse.text

        #持久化

        fileName = word +str(page)+'.html'

        filePath = 'pages/'+fileName

        with open(filePath,'w',encoding='utf-8') as fp:

            fp.write(page_text)

            print('第%d页写入成功'%page)

     

    实例3-10            Requests – cookie

    --cookie

    基于用户的用户数据

    -需求:爬取张三用户的豆瓣网上的个人主页页面数据

                  --cookie作用:

                                1.执行登陆操作(获取cookie)

                                2.在发起个人主页请求时,需要将cookie携带到请求中

                                注意:session对象:发送请求

     

                   -代理操作:

    为什么使用代理?

    -          反爬操作

    -          反反爬虫手段

    分类:

                  正向代理:代替客户端获取数据

                  反向代理:代理服务端提供数据

                   免费代理ip的网站提供商

                                www.goubanjia.com

                                快代理

                                西祠代理

     

    第4章 三种数据解析方式

    4.1 数据解析

    指定url

    发起请求

    获取数据

    数据解析

    持久化存储

    4.2 三种数据解析方式

    正则

     

    Bs4

     

     

    Xpath


    安装xpath插件:就可以直接将xpath表达式作用于浏览器的网页当中

     

    4.3 动态页面加载

    1. seleniun
    2. phantomJs

     

     

    第5章 Scrapy框架

     

     

     

    实例5-1   

    #创建爬虫项目

     

    #创建爬虫文件

     

     

    #编写爬虫文件

     

    修改setting的19行的AU和22行的ROBOTSTXT_OBEY默认是true 改成False不让他遵循ROBOTS协议

     

    启动>scrapy crawl qiubai –nolog

    5.1.2 持久化存储

    持久化存储操作

    A 磁盘文件

        基于终端指令:

        保证parse方法返回一个可迭代类型的对象(存储解析到页面内容)

        使用终端指令完成数据存储到指定的文件当中

      

    -o 指定的磁盘文件 –nolog 不输出日志

     

     

    实例5-2  基于管道的数据存储

    1. items:存储解析到的页面数据
    2. pipelines:处理解析持久化存储相关操作
    3. 基于mysql
    4. 基于redis存储
  • 相关阅读:
    HDU 3123-GCC(递推)
    新交互英语外挂全自己主动版
    BZOJ 2716 Violet 3 天使玩偶 CDQ分治
    关于 FPGA 和 外部芯片接口时序设计
    Ubuntu启动、停止、重新启动MySQL,查看MySQL错误日志、中文编码错误
    Drupal 7 建站学习手记(四):怎样改动Nivo Slider模块的宽高
    Linux下安装Oracle的过程和涉及的知识点-系列4
    游戏开场镜头拉近(Unity3D开发之四)
    并发编程
    给线程发送消息让它执行不同的处理
  • 原文地址:https://www.cnblogs.com/sseban/p/10577182.html
Copyright © 2020-2023  润新知