zoukankan      html  css  js  c++  java
  • 爬虫基础(分类/requests模块使用/数据解析)

    • 爬虫的分类:
      • 通用
      • 聚焦
      • 增量式:监测
    • requests
      • 作用:模拟浏览器发请求
      • get/post:url,data/params,headers
      • 反爬机制:
        • robots.txt
        • UA检测
      • 编码流程:
        • 指定url
        • 发起请求
        • 获取响应数据
        • 持久化存储
      • get/post返回值:响应对象response
        • text:字符串形式的响应数据
        • json():返回的是标准的json串
        • content:二进制形式的响应数据
        • encoding:响应数据的编码
    #简易的网页采集器
    wd = input('enter a word:')
    url = 'https://www.sogou.com/web'
    #将请求参数设定成动态的
    param = {
        'query':wd
    }
    #UA伪装
    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,params=param,headers=headers) #手动设置响应数据的编码(处理中文乱码的问题) response.encoding = 'utf-8' #text返回的是字符串形式的响应数据 page_text = response.text fileName = wd+'.html' with open(fileName,'w',encoding='utf-8') as fp: fp.write(page_text) print(fileName,'下载成功!!!')

    User-Agent:用户代理,http协议中的一部分,属于头域的组成部分,特殊的字符串头

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

    #爬取肯德基餐厅位置信息
    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 (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.post(url=url,data=data,headers=headers)
    
    #json() 返回的是一个json对象类型
    page_text = response.json()
    
    fp = open('./kfc.txt','w',encoding='utf-8')
    for dic in page_text['Table1']:
        address = dic['addressDetail']
        fp.write(address+'
    ')
    fp.close()

    数据爬取下来后,进行解析操作

    • 聚焦爬虫:数据解析
    • 数据解析的原理:
      • 标签定位
      • 获取标签中的数据
    • python实现数据解析的方式:
      • 正则
      • bs4
      • xpath
      • pyquery

    正则

    #使用正则进行数据解析:爬取糗事百科中的图片数据
    import requests
    import re
    from urllib import request
    import os
    if not os.path.exists('./qiutuLibs'):
        os.mkdir('./qiutuLibs')
    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'
    }
    url = 'https://www.qiushibaike.com/pic/'
    #使用通用爬虫对当前url对应的一整张页面源码数据进行爬取
    page_text = requests.get(url=url,headers=headers).text
    
    #数据解析:所有的图片地址
    ex = '<div class="thumb">.*?<img src="(.*?)" alt.*?</div>'
    #re.S是正则中专门用来处理换行
    img_src = re.findall(ex,page_text,re.S)
    for src in img_src:
        src = 'https:'+src
        img_name = src.split('/')[-1]
        img_path = './qiutuLibs/'+img_name
        request.urlretrieve(src,img_path)
        print(img_name,'下载成功')

    bs4解析

    • 解析原理
      • 实例化一个BeautifulSoup对象,并且将即将被解析的源码数据加载到该对象中
      • 调用BeautifulSoup对象中相关的属性和方法进行标签定位和数据提取
    • 环境的安装:
      • pip install bs4
      • pip install lxml
    • BeautifulSoup对象的实例化:
      • BeautifulSoup(fp,'lxml'):是将本地的一个html文档中的源码数据加载到该对象中
      • BeautifulSoup(page_text,'lxml'):是将从互联网上获取的页面源码数据加载到该对象中
    bs4基本操作方法
    
    from bs4 import BeautifulSoup
    fp = open('./test.html','r',encoding='utf-8')
    soup = BeautifulSoup(fp,'lxml')
    #标签定位
    # soup.tagName:定位到的是源码中第一次出现的该标签
    # print(soup.div)
    
    # soup.find('tagName',attrName='value')属性定位
    # print(soup.find('div',class_='tang'))
    # print(soup.find_all('div',class_='tang')[0])
    
    # select('选择器'): 标签,类,id,层级 选择器
    # print(soup.select('#feng'))
    # print(soup.select('.tang > ul > li'))
    # print(soup.select('.tang li')) #空格表示的是多个层级,大于号表示一个层级
    
    #数据提取
    # print(soup.p.string)  #获取的是标签中直系的文本内容
    # print(soup.p.text)   #获取的是标签中所有的文本内容
    # print(soup.p.get_text())
    
    #区别
    # print(soup.select('.song')[0].get_text())
    
    #取属性 ['attrName']
    # print(soup.img['src'])

    xpath解析

    这个解析方法是最常用的.

    • 解析原理
      • 实例化一个etree的对象,并且将页面源码数据加载到该对象中
      • 可以通过调用etree对象的xpath方法结合着不同类型的xpath表达式进行标签定位和数据提取
    • 环境安装: pip install lxml
    • etree对象的实例化:
      • etree.parse('filePath')
      • etree.HTML(page_text)
    from lxml import etree
    
    tree = etree.parse('./test.html')
    
    title = tree.xpath('/html/head/title') #从跟节点开始一层一层的寻找指定的标签
    title = tree.xpath('//title') #不是从跟节点开始寻找
    #属性定位
    div = tree.xpath('//div[@class="song"]')
    #索引定位
    li = tree.xpath('//div[@class="tang"]/ul/li[5]')  #索引是从1开始
    li = tree.xpath('//div[@class="tang"]//li[5]')  #索引是从1开始
    
    #取值   /text()直系的文本内容   //text()所有的文本内容
    a = tree.xpath('//div[@class="song"]/a[1]/text()')
    
    div = tree.xpath('//div[@class="tang"]//text()')
    
    
    #取属性
    a_href = tree.xpath('//div[@class="song"]/a[1]/@href')
    print(a_href[0])
    #需求:爬取http://pic.netbian.com/4kmeinv/    所有的图片数据   分页处理
    url = 'http://pic.netbian.com/4kmeinv/index_%d.html'
    for page in range(1,6):
        if page == 1:
            new_url = 'http://pic.netbian.com/4kmeinv/'
        else:
            new_url = format(url%page)
            
        response = requests.get(url=new_url,headers=headers)
        # response.encoding = 'utf-8'
        page_text = response.text
    
        #数据解析:图片地址 图片名称
        tree = etree.HTML(page_text)
        li_list = tree.xpath('//*[@id="main"]/div[3]/ul/li')
        for li in li_list:
            img_src = 'http://pic.netbian.com'+li.xpath('./a/img/@src')[0]
            img_name = li.xpath('./a/img/@alt')[0]+'.jpg'
            img_name = img_name.encode('iso-8859-1').decode('gbk')
            request.urlretrieve(img_src,img_name)
            print(img_name,'下载成功!!!')
    Xpath简单应用
  • 相关阅读:
    用Webshell直接杀入内网
    别再说找不到Python练手项目了,这80个拿去过冬
    亲爱的,我是一条Linux运维技术学习路径呀。
    一份C++学习资源,咬牙切齿地好用呀
    技术变现,到底怎么变?本文或能成为你的“点金石”
    40个大数据学习资源,个个是干货,最后7个太给力
    零基础如何学好数据分析?
    8个程序员专用软件/网站,个个是神器,第一个最惊喜......
    如何写一个优秀的GitHub项目README文档?
    超全PHP学习资源整理:入门到进阶系列
  • 原文地址:https://www.cnblogs.com/wmh33/p/11040944.html
Copyright © 2011-2022 走看看