zoukankan      html  css  js  c++  java
  • 爬虫第一天

    爬虫学习参考博客:https://www.cnblogs.com/cyycyhcbw/articles/10442399.html

    1.使用软件anaconda

    2.输入jupyter notbook 

    3.anaconda使用快捷键

    -插入cell:     a  上一行插入        b 下一行插入

    -删除: x

    -模式切换: m切换到master      y 切换到code

    -执行cell:shift+enter

    -tab

    -打开帮助文档:shift+tab

    4.爬虫概述

    通过编写程序模拟浏览器上网,然后让其去互联网上爬取数据的过程

    5.爬虫的分类:

      5.1通用爬虫:爬取一整张页面源码数据

      5.2聚焦爬虫:爬取页面中指定的局部数据

      5.3增量式爬虫:检测网站数据更新的情况,爬取的就是网站中最新的数据

    6.反爬机制

    7.反反爬策略

    8.第一个反爬机制:robots.txt协议

    二:requests模块的应用

    -requests:功能强大,操作简单

    -urllib

    -作用:用来模拟浏览器发请求

    -编码流程

      -指定url

      -发起请求:requests.get/post

      -获取响应数据

      -持久化存储

    #爬取搜狗首页的源码数据
    import requests
    
    #1.
    url="https://www.sogou.com/"
    #2.
    response=requestes.get(url=url)
    #3.
    page_text=response.text
    #4.
    with open('/sougou.html','w',encoding='utf-8') as fp:
        fp.write(page_text)

     

    #简易的网页采集器
    wd=input('enter a word')
    #1.
    url="https://www.sogou.com/web?"
    #2.将请求参数设定为动态的
    param={
        "query":wd
    }
    #3.params传参
    response=requests.get(url=url,params=param)
    #4.手动设置响应数据的编码,处理中文乱码问题
    response.encoding='utf-8'
    #5.text返回的是字符串形式的响应数据
    page_text=response.text
    
    filename=wd+'.html'
    
    with open(filename,'w',enconding='utf-8') as fp:
        fp.write(page_text)


    #打开页面会出现以下错误,这是网站的反爬机制
    #用户您好,我们的系统检测到您网络中存在异常访问请求。
    #此验证码用于确认这些请求是您的正常行为而不是自动程序发出的,需要您协助验证。

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

    UA检测:门户网站的服务器端会检测每一个请求的UA,如果检测到请求的UA为爬虫程序,则请求失败

    UA伪装:

    #简易的网页采集器
    wd=input('enter a word')
    #1.
    url="https://www.sogou.com/web?"
    #2.将请求参数设定为动态的
    param={
        "query":wd
    }
    #UA伪装
    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'
    }
    #3.params传参
    response=requests.get(url=url,params=param,headers=headers)
    #4.手动设置响应数据的编码,处理中文乱码问题
    response.encoding='utf-8'
    #5.text返回的是字符串形式的响应数据
    page_text=response.text
    
    filename=wd+'.html'
    
    with open(filename,'w',encoding='utf-8') as fp:
        fp.write(page_text)

     

     

     

    #爬取肯德基餐厅位置信息(有关于ajax刷新页面的数据采集)
    url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    #动态生成城市
    city=input('enter a city name:')
    data={
        'cname': '',
        'pid': '',
        'keyword': city,
        'pageIndex': '1',
        'pageSize': '10',
    }
    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'
    }
    response=requests.post(url=url,data=data,headers=headers)
    
    page_text=response.json()
    print(page_text)
    
    #这里文件操作可以覆盖写入,也可以追加写入
    
    fp=open('/kfc.text','w',encoding='utf-8')
    
    
    for dic in page_text['Table1']:
        addr=dic['addressDetail']
    print(addr)
        fp.write(addr+'
    ')
    fp.clouse()
    •  爬取动态加载的页面数据

    #爬取豆瓣电影的电影详情数据
    url='https://movie.douban.com/j/chart/top_list'
    s =1
    limit=100
    param={
        'type': '5'
        'interval_id': '100:90'
        'action':'' 
        'start': s
        'limit': limit
    }
    response=requests.get(url=url,headers=headers,params=param)
    
    page_text=response.json()

     爬取药监局相关的数据http://125.35.6.84:81/xk/

    • 发现首页中的所有的企业数据都是动态加载出来的
    • 通过抓包工具捕获动态加载数据对应的数据包
    • 从上一步的数据包对应的响应数据中提取到企业的相关信息(ID)
    • 通过分析每一家企业详情页面的url发现,所有的详情页的url域名都是一样的,只有id不同
    • 可以通过获取每一家企业的id结合着固定的域名拼接成详情页的url
    • 对url发起请求就可以获取企业详情数据

    #爬取药监局相关的数据http://125.35.6.84:81/xk/
    url = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
    data = {
        "on": "true",
        "pageSize": "15",
        "productName": "",
        "conditionType": "1",
        "applyname": "",
        "applysn": "",
    }
    page_text = requests.post(url=url,headers=headers,data=data).json()
    
    for dic in page_text['list']:
        _id = dic['ID']
      #拿到ID后发现详情页面也是动态加载的,所以上面的步骤要重新来一遍,就可以拿到详情页面的数据了,注意请求方式为post detail_url
    = 'http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById' data = { 'id':_id } detail_data = requests.post(url=detail_url,headers=headers,data=data).json() print(detail_data)

     爬取图片

    •  content返回的是二进制byte形式的响应数据
    •  两种方法:1是用requests,2是用urllib
    #如何爬取图片
    url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560235823355&di=4f6c6ad96539247edda08e7ad09f0dee&imgtype=0&src=http%3A%2F%2Fgss0.baidu.com%2F-fo3dSag_xI4khGko9WTAnF6hhy%2Fzhidao%2Fpic%2Fitem%2Fadaf2edda3cc7cd9e3670adb3901213fb80e916d.jpg'
    #content返回的是二进制bytes形式的响应数据
    img_data = requests.get(url=url,headers=headers).content
    
    with open('./123.jpg','wb') as fp:
        fp.write(img_data)
    from urllib import request
    url = 'https://timgsa.baidu.com/timg?image&quality=80&size=b9999_10000&sec=1560235823355&di=4f6c6ad96539247edda08e7ad09f0dee&imgtype=0&src=http%3A%2F%2Fgss0.baidu.com%2F-fo3dSag_xI4khGko9WTAnF6hhy%2Fzhidao%2Fpic%2Fitem%2Fadaf2edda3cc7cd9e3670adb3901213fb80e916d.jpg'
    
    request.urlretrieve(url=url,filename='./456.jpg')

     http协议:client和server进行数据交互的形式

    https协议:http加密后

    参考https://www.cnblogs.com/bobo-zhang/p/9645715.html

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

    回顾总结:

    爬虫的分类:

      通用爬虫:爬取一整个页面

      聚焦爬虫:爬取页面的某一部分

      增量式爬虫:对新增内容的爬取

    requests的使用

      作用:模拟浏览器发请求

      get/post:参数url params/data,headers

      反爬机制:

        robots:不需要做任何事情,直接可以爬取

        UA检测:UA伪装   User-Agent

      编码流程:

        指定url  

        发起请求

        获取响应数据

        持久化存储

      get/post返回值:响应对象response

        text:字符串形式的响应数据

        json():返回的是标准的json数据,也就是字典

        content:二进制形式的响应数据

        encoding:响应数据的编码

  • 相关阅读:
    登录模块(前端bookstrapValidator校验+加密+后台加密+后台验证)
    spring+springmvc+mybatis+redis 实现两重数据缓存
    spring+springmvc+mybatis+redis实现缓存
    获取网页上的所有QQ号码,并生成exel报表
    单点登录(因为原理一样,所以没有实现注销)
    solr 基本命令二(权重查找)
    solr 搭建 (基于solr-5.0.0)
    OC 添加导航栏item
    xcode 一些三方库版本警告 iOS Simulator deployment target 'IPHONEOS_DEPLOYMENT_TARGET' is set to 8.0, but the range of supported deployment target versions is 9.0 to 14.2.99.
    Swift UITextView设置富文本点击, 取消一切点击事件(放大镜/复制粘贴/删除等等)
  • 原文地址:https://www.cnblogs.com/l1222514/p/11006430.html
Copyright © 2011-2022 走看看