zoukankan      html  css  js  c++  java
  • 005 爬虫(requests与beautifulSoup库的使用)

    一:知识点

    1.安装requests库

      

    2.Brautiful soup

      可以提供一些简单的,python式的函数来处理导航,搜索,修改分析树等功能。

      她是一个工具箱,通过解析文档为用户提供需要抓去的数据。

      自动将输入文档转换为Unicode编码,输出文档转换为utf-8编码。

      现在是使用Beautiful Soup4,不过现在已经被移植到BS4了,即导入需要导入bs4。

    3.导入

      pip install beautifulsoup4

      

    4.创建Beautiful Soup对象

      导入bs4库

        from bs4 import BeautifulSoup

      创建:

        soup=BeautifulSoup(html)

    5.程序

    1 import requests
    2 from bs4 import BeautifulSoup
    3 r=requests.get("http://www.baidu.com",headers={'User-Agent':'Mozilla/4.0'})
    4 soup=BeautifulSoup(r.text,"html.parser")
    5 print soup.prettify()

    6.打印soup的内容

      print soup.prettify()

    7.四大对象种类

      Beautiful Soup将复杂的HTML文档转换成一个复杂的树形结构,每个节点都是Python对象,将所有的对象归纳为四种。

        BeautifulSoup

        Tag

        NavigableString

        Comment

    8.BeautifulSoup

      对象表示是一个文档的全部内容,大部分的时候,可以将它当作Tag对象,是一个特殊的Tag,我们可以获取它的类型,名称,以及属性。

      soup.name

      soup.attrs

    9.Tag的使用

      找到的是第一个,后面的都没显示。

      soup.title.name

      soup.title.attrs

      soup.meta['content']

      soup.meta.get('content')

    1 import requests
    2 from bs4 import BeautifulSoup
    3 r=requests.get("http://www.baidu.com",headers={'User-Agent':'Mozilla/4.0'})
    4 soup=BeautifulSoup(r.text,"html.parser")
    5 print soup.title
    6 print soup.meta

    效果:

      <title>百度一下,你就知道</title>
      <meta content="text/html;charset=utf-8" http-equiv="content-type"/>

    10.NavigableString

      获取标签内部的文字。

      soup.标签名.string

    1 import requests
    2 from bs4 import BeautifulSoup
    3 r=requests.get("http://www.baidu.com",headers={'User-Agent':'Mozilla/4.0'})
    4 soup=BeautifulSoup(r.text,"html.parser")
    5 print soup.title.string

    效果:

      百度一下,你就知道

    11.Comment

      是一个特殊类型的NavigableString对象,其实输出的内容仍然不包含注释符号。

    12.常用方法(过滤)

      name

      attrs

      text

      limit

      recursive:要不要搜索子孙节点。

      

    13.常用方法

      find_all

      find

      .contents     .children

      .descendants

      .string

      .parent

      .next_sibling

      next_elements     .previous_elements

    14.程序

    1 import requests
    2 from bs4 import BeautifulSoup
    3 r=requests.get("http://www.baidu.com",headers={'User-Agent':'Mozilla/4.0'})
    4 soup=BeautifulSoup(r.text,"html.parser")
    5 print soup.script.parent
    6 print soup.title.string

    二:案例

    1.网址

      https://movie.douban.com/top250?start=0&filter=

      

    2.程序

     1 #encoding=utf-8
     2 import requests
     3 from bs4 import BeautifulSoup
     4 import re
     5 import xlwt
     6 
     7 #创建全局变量,保存电影信息
     8 dataList=[]
     9 
    10 #根据地址和开始行获取网页的文本内容
    11 def getHtmlTest(url,startRow):
    12     #头部筛选函数
    13     if(startRow==0):
    14         param={}
    15     else:
    16         param={'start':startRow,'filter':''}
    17     #获取网页
    18     r=requests.get(url,params=param,headers={'User-Agent':'Mozilla/4.0'})
    19     return r.text
    20 
    21 #创建函数将传入的文本解析获取所需要的数据
    22 def getData(html):
    23     soup=BeautifulSoup(html,'html.parser')
    24     #获取class为grid_view的ol下面的所有列表
    25     movieList=soup.find('ol',attrs={'class':'grid_view'})
    26     #遍历查找内容
    27     for movieLi in movieList.find_all('li'):
    28         data=[]
    29         #获取电影名称
    30         movieHd=movieLi.find('div',attrs={'class':'hd'})
    31         movieName=movieHd.find('span',attrs={'class':'title'}).getText()
    32         data.append(movieName)
    33 
    34         #电影分数
    35         movieScore=movieLi.find('span',attrs={'class':'rating_num'}).getText()
    36         data.append(movieScore)
    37 
    38         #电影评价人数
    39         movieEval=movieLi.find('div',attrs={'class':'star'})
    40         movieEvalNum=re.findall(r'd+',str(movieEval))[-1]
    41         data.append(movieEvalNum)
    42 
    43         #电影评价
    44         movieQuote=movieLi.find('span',attrs={'class','inq'})
    45         if(movieQuote):
    46             data.append(movieQuote.getText())
    47         else:
    48             data.append("无影评信息")
    49 
    50         #添加到全局变量中
    51         dataList.append(data)
    52     return
    53 
    54 #保存到excel
    55 def saveData(savePath):
    56     book=xlwt.Workbook(encoding='utf-8')
    57     sheet=book.add_sheet('前250名的电影信息')
    58     col=(u'电影名称',u'电影评分',u'评论人数',u'短评')
    59     for i in range(0,4):
    60         sheet.write(0,i,col[i])
    61     for i in range(0,250):
    62         data=dataList[i]
    63         for j in range(0,4):
    64             sheet.write(i+1,j,data[j])
    65     book.save(savePath)
    66     return
    67 
    68 #创建主函数
    69 def mainFunc():
    70     url='https://movie.douban.com/top250'
    71     startRow=0
    72     while startRow<250:
    73         html=getHtmlTest(url,startRow)
    74         getData(html)
    75         startRow += 25
    76     saveData('movieData.xls')
    77     return
    78 
    79 #测试
    80 mainFunc()

    3.效果

      

      

    ·

  • 相关阅读:
    计算子网掩码中存在的主机数
    IP相关常识
    IP子网掩码划分及设置
    spark的外排:AppendOnlyMap与ExternalAppendOnlyMap
    Struts2+JSON数据
    Spark -14:spark Hadoop 高可用模式下读写hdfs
    log4j 日志 配置 学习
    flume的memeryChannel中transactionCapacity和sink的batchsize需要注意事项
    Python画图matplotlib展示图中中文乱码
    Python pycharm(windows版本)部署spark环境
  • 原文地址:https://www.cnblogs.com/juncaoit/p/7599662.html
Copyright © 2011-2022 走看看