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

    爬虫基础

    什么是爬虫?

    爬虫是通过程序模拟浏览器上网,从网上获取数据的过程.

    爬虫的分类:

      通用爬虫:爬取一整个页面的数据.

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

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

    什么是反爬机制?

      网站制作时设置的一系列阻止爬虫程序进行的阻碍,就是反爬机制,反爬机制针对的是爬虫代码.

    什么是反反爬机制?

      解决反爬机制所使用的策略,反反爬机制针对的是网站.

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

    requests模块的应用

    requests: 

    功能强大,操作简单

    编码流程:(可以理解成去网页查找东西一样)

      1.获取url(找到对应的网站)

      2.发送请求(回车)

      3.获取响应数据(页面返回给你的数据)

      4.持久化存储(将页面返回给你的数据保存到指定位置)

    例如:爬取搜狗首页源码数据

    import requests
    
    msg=input('请输入你要搜索的内容:')
    url = 'https://www.sogou.com/'
    
    #参数从网页中的form_data中复制过来即可
    params={
        'query':msg
        }
    
    headers = {
        'User-Agent':'Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1'
    }
    
    response=requests.get(url=url,headers=headers,params=params)
    page_text=response.text
    print(page_text)

    User-Agent: 请求载体的身份标识
    UA检测:门户网站的服务器会检测每一个请求发送过来的UA,如果检测到是爬虫程序,则请求发送失败.
    UA伪装:
      即在代码中加入User-Agent即可.

    爬取肯德基所有上海餐厅的位置

    import requests
    
    #爬取肯德基所有上海位置的信息
    url='http://www.kfc.com.cn/kfccda/ashx/GetStoreList.ashx?op=keyword'
    for i in range(1,5):
      #data中的数据是从网站中的form data中复制过来的 data
    ={ 'cname': '', 'pid': '', 'keyword': '上海', 'pageIndex': i, 'pageSize': '10' } headers={ 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36' }    #判断请求方式 response=requests.post(url=url,data=data,headers=headers) page_info=response.json() file=open('./kfc.txt','a+',encoding='utf-8')
       #保存数据
    for one_info in page_info['Table1']: file.write(one_info['addressDetail']+' ') file.close()

    爬取豆瓣电影的电影详情数据

    import requests
    
    url = 'https://movie.douban.com/j/chart/top_list'
    
    headers={
            'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
                }
    
    params={
            "type": "5",
            "interval_id": "100:90",
            "action": "",
            "start": '1',
            "limit": '20',
            }
    #判断请求方式
    response=requests.get(url=url,params=params,headers=headers)
    
    page_text=response.json()

    动态加载的页面数据分析:

         1.我们通过请求发现,所有的企业数据都是通过动态加载出来的

      2.通过抓包工具不过动态加载数据对应的数据包

      3.从上一步获取的数据包中提取出企业的相关信息

      4.通过分析每一家详情页的url,所有的详情页的url的域名都是相同的,只是id不同

      5.在分析详情页中的数据都是通过动态加载出来的,所以这里还是需要抓包工具来对数据进行捕获.

      6.可以通过固定的url地址和不同的id进行拼接成企业详情页对应的url.

      7.通过对url进行发送请求就可以获取到企业相关的数据了.

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

    import requests
    
    url='http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsList'
    headers={
        'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36',
    }
    for i in range(1,330):
        data={
            'on': 'true',
            'page': i,
            'pageSize': '15',
            'productName': '',
            'conditionType': '1',
            'applyname': '',
            'applysn': '',
        }
    
        response=requests.post(url=url,headers=headers,data=data)
        page_info=response.json()
        page_list=[]
        for one_info in page_info['list']:
            detail_id=one_info['ID']
            detail_url='http://125.35.6.84:81/xk/itownet/portalAction.do?method=getXkzsById'
            data={
                'id': detail_id
            }
            detail_info=requests.post(url=detail_url,headers=headers,data=data).json()
            page_list.append(detail_info)
        fp=open('./HZP.txt','a+',encoding='utf-8')
        for one_hzp in page_list:
            fp.write(one_hzp['epsName']+' '+one_hzp['businessPerson']+'
    ')
    
        fp.close()

    urllib(个人感觉只要返回的形式是2进制流,他都可以返回)

    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'
    
    response=request.urlretrieve(url=url,filename='./晓.jpg')

    http协议和https协议

      什么是http协议:客户端和服务端进行数据交互的形式

      什么是https协议: 安全的http协议,对传输的数据进行加密

        对称秘钥加密(有弊端): 把秘钥和数据一起传送过去

        非对称秘钥加密(有弊端): 服务端先发送秘钥,然后客户端按照秘钥形式进行加密,发送过去之后再通过秘钥进行解密

        证书秘钥加密(现在普遍应用):服务端先将公开秘钥发送给一个权威的认证机构,认证通过之后给秘钥做标识,然后拿到权威的证书,校验通过之后,客户端通过证书进行加密,服务端通过证书进行解密.

      

  • 相关阅读:
    react native ios 报错SyntaxError: Unexpected end of JSON input
    微信小程序父组件给子组件传参
    xcode10 Command PhaseScriptExecution failed with a nonzero exit code
    html中的video放置在微信上打开会全屏显示,并且丢失文件上的其他内容
    vue cli使用vue-awesome-swiper动画
    vue 使用swiper
    react native 配置leancloud推送 ios版
    iOS----------jenkins
    iOS----------学习路线思维导图
    iOS学习路线
  • 原文地址:https://www.cnblogs.com/zty1304368100/p/11006238.html
Copyright © 2011-2022 走看看