iis服务器助手广告广告
返回顶部
首页 > 资讯 > 后端开发 > Python >爬虫之数据解析
  • 313
分享到

爬虫之数据解析

爬虫数据 2023-01-30 23:01:44 313人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

  一、啥是数据解析   在上一篇关于爬虫的博客里,我提到过,整个爬虫分为四个部分,上一篇博客已经完成了前两步,也就是我说的最难的地方,接下来这一步数据解析不是很难,但就是很烦人,但只要你有耐心,一步一步查找、排除就会提取出目标信息,这一

  一、啥是数据解析

  在上一篇关于爬虫的博客里,我提到过,整个爬虫分为四个部分,上一篇博客已经完成了前两步,也就是我说的最难的地方,接下来这一步数据解析不是很难,但就是很烦人,但只要你有耐心,一步一步查找、排除就会提取出目标信息,这一步就相当于从接收到的庞大数据中提取出真正想要、有意义的信息,所以对于爬虫来说,应该是很重要的。

  数据解析有三种方式,一是通过正则表达式,在python中就是利用re模块;二是xpath;三是利用BeautifulSoup。

  二、正则表达式

  之前我们在学模块的时候讲过正则表达式,在这就不细说,献上经常用到的

   单字符:
        . : 除换行以外所有字符
        [] :[aoe] [a-w] 匹配集合中任意一个字符
        \d :数字  [0-9]
        \D : 非数字
        \w :数字、字母、下划线
        \W : 非\w
        \s :所有的空白字符包,括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
        \S : 非空白
    数量修饰:
        * : 任意多次  >=0
        + : 至少1次   >=1
        ? : 可有可无  0次或者1次
        {m} :固定m次 hello{3,}
        {m,} :至少m次
        {m,n} :m-n次
    边界:
        $ : 以某某结尾 
        ^ : 以某某开头
    分组:
        (ab)  
    贪婪模式: .*
    非贪婪(惰性)模式: .*?

    re.I : 忽略大小写
    re.M :多行匹配
    re.S :单行匹配

    re.sub(正则表达式, 替换内容, 字符串)

  三、xpath

  1,常用表达式

属性定位:
    #找到class属性值为song的div标签
    //div[@class="song"] 
层级&索引定位:
    #找到class属性值为tang的div的直系子标签ul下的第二个子标签li下的直系子标签a
    //div[@class="tang"]/ul/li[2]/a
逻辑运算:
    #找到href属性值为空且class属性值为du的a标签
    //a[@href="" and @class="du"]
模糊匹配:
    //div[contains(@class, "ng")]
    //div[starts-with(@class, "ta")]
取文本:
    # /表示获取某个标签下的文本内容
    # //表示获取某个标签下的文本内容和所有子标签下的文本内容
    //div[@class="song"]/p[1]/text()
    //div[@class="tang"]//text()
取属性:
    //div[@class="tang"]//li[2]/a/@href

我们在使用xpath时,想要把字符串转化为etree对象:
tree=etree.parse(文件名)#这种是把一个本地文件转化成rtree对象
tree=etree.html(html标签字符串)
tree.xpath(xpath表达式) #这样就可以通过找到某个标签,取出标签的某个属性就得到想要的结果

  2,示例一,爬取糗事百科图片,保存在本地

import requests
from lxml import etree
#这是请求的路径
url='https://www.qiushibaike.com/pic/' #这是伪造的浏览器UA
headers={ 'User-Agent':'Mozilla/5.0 (windows NT 10.0; Win64; x64) AppleWEBKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36' }
#content拿到的是页面代码 content=requests.get(url=url,headers=headers).text
#把这个页面字符串代码转换成etree对象 tree=etree.HTML(content)
#这是拿到所有class=‘thumb’的div标签下的img标签的src属性,返回的是一个列表 img_src_list=tree.xpath('//div[@class="thumb"]//img/@src')
#循环每个src,然后再去访问,拿到图片的字节数据,存放于JPG文件,就得到每张图片了 for img_src in img_src_list: c1=requests.get(url='Https:'+img_src,headers=headers).content with open('%s.jpg'%img_src[:5],'wb') as f: f.write(c1)

  3,示例二,爬取煎蛋网的图片

  这个就不是那么简单了,可以说是及其的难,我们用浏览器去访问一下煎蛋网,查看一下每张图片的src。

在这个元素的页面上,也就是加载完毕后的HTML文件,上面可以看到img的src属性,不用猜,这个肯定是图片的地址,很是兴奋,急急忙忙的写程序,访问页面,拿去img的src值,然后再发起请求拿到图片数据,保存下来,运行程序出错了,不是预期的结果。在这,给大家分享一个反爬机制,对于图片的src属性并不是直接写在html页面上的,而是在加载页面时用js得到img的src属性,然后赋值过去,其实我们可以点开network,查看response,这个response才是真正返回的HTML文件内容,也就是接收的内容。如下图:

  从response来看,它的所有图片的src都是一样的,说明并不是图片真正的输入窗路径,后面跟了一个span标签,class为img-hash,文本内容为一大段字符,可以猜出这是一个hash值,这个值就是img的src加密后的hash值,所以在加载页面时,通过js把加密的字符解开就是img的src属性,然后再赋给src(别问我是咋知道,我看别人这样写的,但确实是对的),这种通过js来动态加载的页面是一种反爬机制,而且是一种让人很头疼的反爬机制。

  现在我们想要拿到他的src,就需要我们从返回的html文件中取出每个img-hash值,然后解密,得到真正的src,然后再对src发起请求。

import requests
from lxml import etree
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
}
import base64
url='http://jandan.net/ooxx'
content=requests.get(url=url,headers=headers).text
tree=etree.HTML(content)
hash_list=tree.xpath('//span[@class="img-hash"]/text()')   #这是拿到了所有的img-hsah值,存放在一个列表中

for i in hash_list:
    ur=base64.b64decode(i).decode()           #这里用base64解密(不要问我为啥用这个解密,你咋知道的。大佬说,在js代码发现有base64和md5的字样,然而md5是不可逆的,所以就是base64了)
    con=requests.get(url='http:'+ur,headers=headers).content
    with open('%s.jpg'%i,'wb') as f:
        f.write(con)

  四、BeautifulSoup

  1,方法

from bs4 import BeautifulSoup
soup = BeautifulSoup(open('本地文件'), 'lxml')    #这是把一个本地文件转换成BeautifulSoup对象
soup = BeautifulSoup('字符串类型或者字节类型', 'lxml')#这是把HTML字符串转换成BeautifulSoup对象

基础巩固:
    (1)根据标签名查找
        - soup.a   只能找到第一个a标签,其他标签一样
    (2)获取属性
        - soup.a.attrs  获取第一个a标签所有的属性和属性值,返回一个字典
        - soup.a.attrs['href']   获取href属性
        - soup.a['href']   也可简写为这种形式
    (3)获取内容
        - soup.a.string
        - soup.a.text
        - soup.a.get_text()
       【注意】如果标签还有标签,那么string获取到的结果为None,而其它两个,可以获取文本内容
    (4)find:找到第一个符合要求的标签
        - soup.find('a')  
        - soup.find('a', title="xxx")
        - soup.find('a', alt="xxx")
        - soup.find('a', class_="xxx")    #按类查找,得在把class写成class_
        - soup.find('a', id="xxx")
    (5)find_all:找到所有符合要求的标签
        - soup.find_all('a')
        - soup.find_all(['a','b']) 找到所有的a和b标签
        - soup.find_all('a', limit=2)  限制前两个
    (6)根据选择器选择指定的内容       #选择器的规则和CSS一模一样,
               select:soup.select('#feng')
        - 常见的选择器:标签选择器(a)、类选择器(.)、id选择器(#)、层级选择器
            - 层级选择器:
                div .dudu #lala .meme .xixi  下面好多级
                div > p > a > .lala          只能是下面一级
        【注意】select选择器返回永远是列表,需要通过下标提取指定的对象

  2,实例一,爬取抽屉网的新闻标题和连接

from bs4 import BeautifulSoup
import requests
url='https://dig.chouti.com/'
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
}
con=requests.get(url=url,headers=headers).text
#这是实例化一个BeautifulSoup对象,对象就可以使用find、find_all等方法 soup=BeautifulSoup(con,'lxml') a_list=soup.find_all('a',class_="show-content color-chag")#这是拿到了很多的a标签, data_list=[] for a in a_list: dic={} dic['url']=a['href'] dic['content']=a.text.strip() data_list.append(dic) print(data_list)

  3,实例二,爬取58同城的房源信息

from bs4 import BeautifulSoup
import requests
import xlwt
import re
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36'
}
#这是创建一个excel,并创建一个sheet表,设置属性 workbook = xlwt.Workbook(encoding='ascii') worksheet = workbook.add_sheet('My Worksheet') worksheet.col(0).width = 14000 worksheet.col(5).width = 24000 #发送请求 url='https://sz.58.com/ershoufang/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT&PGTID=0d30000c-0000-4591-0324-370565eccba8&ClickID=1' res=requests.get(url=url,headers=headers) con=res.text
#实例化一个对象 soup=BeautifulSoup(con,'lxml') ss=soup.find('ul',class_='house-list-wrap') li_list=ss.find_all('li') #这是拿到了所有的li标签 patter=re.compile(r'\s',re.S)
#这是循环每个li标签,这里拿到的每个li标签还是一个BeautifulSoup对象,一样拥有find、find_all等方法,对每个li标签处理拿到每个房源的各种信息,然后写入Excel中 for num in range(len(li_list)): worksheet.write(num, 0, label=li_list[num].find('a',tongji_label="listclick").text.strip()) p1=li_list[num].find_all('p')[0] span_list=p1.find_all('span') worksheet.write(num, 1, label=patter.sub('',span_list[0].text)) worksheet.write(num, 2, label=patter.sub('',span_list[1].text)) worksheet.write(num, 3, label=patter.sub('',span_list[2].text)) worksheet.write(num, 4, label=patter.sub('',span_list[3].text)) worksheet.write(num,5, label=patter.sub('',li_list[num].find('div',class_='jjrinfo').text)) worksheet.write(num, 6, label=li_list[num].find('p',class_='sum').text) worksheet.write(num, 7, label=li_list[num].find('p',class_='unit').text) workbook.save('myWorkbook.xls')

  4,实例三,爬取GitHub

  github是需要登录验证的,所以我们照我上一篇讲的模拟登录的步骤,先用浏览器输入一组错误信息,点击登录,找的登录发送的路径和数据结构

  明显发现这就是登录请求的路径,数据结构拿到了,再去拿到请求的路径

  这下就可以发送请求,我最先访问的是login页面,得到cookie,带这个cookie和data数据,往登录的路径发送请求,但不得行。于是乎回来看了一看,要求的数据结构,其中有个叫token的东西,怎么那么熟悉,这个不是那个随机值CSRF-token,我就再去看了一下HTML页面,

  确实是基于fORM表单发送请求的CSRF-token,这个东西是一个随机值,所以我的程序得想去访问login页面,拿到登陆页面,取得这个token值,放在data数据里,我之前程序的其他部分就不用变了,于是乎就成功了。

import requests
import re
url='https://github.com/login'

url1='https://github.com/session'
headers={
    'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.119 Safari/537.36',
}
session=requests.session()
res1=session.get(url=url,headers=headers)
token=re.findall(r'name="authenticity_token".*?value="(?P<name>.*?)"',res1.text,re.S)[0]      #这就是用BeautifulSoup取得token值
data={
'commit': 'Sign in',
'utf8': '✓',
'authenticity_token': token,
'login': 'xxxxxx',
'passWord':'xxxxx'
}
session.post(url=url1,data=data,headers=headers)
url2='https://github.com/'
res=session.get(url=url2,headers=headers)
with open('github1.html','wb') as f:
    f.write(res.content)

   注意:

  1,xpath和BeautifulSoup都是针对标签的解析方式,意思就是字符串得是一个标签字符串,其次是要先找到标签,然后获取标签的某个属性值

  2,xpath和BeautifulSoup找的标签,依然是一个对象,意思就是同样可以用那些方法,就不用我们把找到的标签再次实例化成对象

--结束END--

本文标题: 爬虫之数据解析

本文链接: https://www.lsjlt.com/news/181278.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • 爬虫之数据解析
      一、啥是数据解析   在上一篇关于爬虫的博客里,我提到过,整个爬虫分为四个部分,上一篇博客已经完成了前两步,也就是我说的最难的地方,接下来这一步数据解析不是很难,但就是很烦人,但只要你有耐心,一步一步查找、排除就会提取出目标信息,这一...
    99+
    2023-01-30
    爬虫 数据
  • Python爬虫与数据分析之爬虫技能:u
    专栏目录: Python爬虫与数据分析之python教学视频、python源码分享,python Python爬虫与数据分析之基础教程:Python的语法、字典、元组、列表 Python爬虫与数据分析之进阶教程:文件操作、lambda表达...
    99+
    2023-01-31
    爬虫 技能 数据
  • 【Python爬虫】数据解析之bs4解析和xpath解析
    🔥一个人走得远了,就会忘记自己为了什么而出发,希望你可以不忘初心,不要随波逐流,一直走下去🎶 🦋 欢迎关注🖱点赞👍收...
    99+
    2023-09-06
    python 爬虫 开发语言
  • Python爬虫实战之xpath解析
    XPath 是一门在 XML 文档中查找信息的语言,最初是用来搜寻 XML 文档的,但是它同样适用于 HTML 文档的搜索。 所以在Python爬虫中,我们经常使用xpath解析这种高效便捷的方式来提...
    99+
    2023-09-23
    python 爬虫 开发语言
  • python爬虫之爬取谷歌趋势数据
    一、前言  爬取谷歌趋势数据需要科学上网~ 二、思路 谷歌数据的爬取很简单,就是代码有点长。主要分下面几个就行了 爬取的三个界面返回的都是json数据。主要获取对应的tok...
    99+
    2024-04-02
  • Python爬虫之解析HTML页面详解
    目录用Python解析HTML页面HTML 页面的结构XPath 解析CSS 选择器解析正则表达式解析总结用Python解析HTML页面 在网络爬取的过程中,我们通常需要对所爬取的页...
    99+
    2023-05-18
    Python解析HTML Python爬虫HTML
  • Python爬虫数据举例分析
    本篇内容介绍了“Python爬虫数据举例分析”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!获取数据打开斗鱼直播界面,连续点击翻页Networ...
    99+
    2023-06-02
  • Python爬虫之爬取2020女团选秀数据的示例分析
    这篇文章主要介绍Python爬虫之爬取2020女团选秀数据的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、先看结果1.1创造营2020撑腰榜前三甲创造营2020撑腰榜前三名分别是 希林娜依·高、陈卓璇 、...
    99+
    2023-06-14
  • Python爬虫之爬取2020女团选秀数据
    目录一、先看结果1.1创造营2020撑腰榜前三甲1.2青春有你2当前官方榜前三甲1.3Face++男女视角颜值最高1.3.1女性视角颜值第一名1.3.2男性视角颜值第一名1.4小姐姐...
    99+
    2024-04-02
  • Python爬虫之爬取某文库文档数据
    目录一、基本开发环境二、相关模块的使用三、目标网页分析四、整体思路五、爬虫代码实现六、写入文档一、基本开发环境 Python 3.6 Pycharm 二、相关模块的使用 impo...
    99+
    2024-04-02
  • python爬虫指南之xpath实例解析
    Python爬虫指南之XPath实例解析XPath是一种用于在XML文档中进行导航和查找元素的语言。在爬虫中,XPath可以用于解析...
    99+
    2023-08-15
    python
  • python爬虫教程之bs4解析和xpath解析详解
    目录bs4解析原理:如何实例化BeautifulSoup对象:用于数据解析的方法和属性:xpath解析xpath解析原理:实例化一个etree对象:xpath( ‘xpa...
    99+
    2024-04-02
  • Python爬虫10-页面解析数据提取思
    GitHub代码练习地址:正则1:https://github.com/Neo-ML/PythonPractice/blob/master/SpiderPrac15_RE1.py           正则2:match、search、fi...
    99+
    2023-01-31
    爬虫 页面 数据
  • python爬虫之教你如何爬取地理数据
    目录一、shapely模块1、shapely2、point→Point类3、导入所需模块4、Point(1)、创建point,主要有以下三种方法(2)、point常用属性(3)、po...
    99+
    2024-04-02
  • Python爬虫之在MySQL中存储数据
    MySQL是一个开源的关系型数据库管理系统,被广泛应用于网站开发中的数据存储。在爬虫中,数据的存储是非常重要的一环。下面我们先简单介绍MySQL的基本知识,再讲一下在Python爬虫中如何使用MySQL进行数据存储。 MySQL基本概念 数...
    99+
    2023-10-09
    数据库 mysql python
  • 爬虫学习之第四章爬虫进阶之多线程爬虫
    有些时候,比如下载图片,因为下载图片是一个耗时的操作。如果采用之前那种同步的方式下载。那效率肯会特别慢。这时候我们就可以考虑使用多线程的方式来下载图片。 多线程介绍: 多线程是为了同步完成多项任务,通过提高资源使用效率来提高系统的效率...
    99+
    2023-01-31
    爬虫 进阶 第四章
  • python爬虫之解析库正则表达式
       上次说到了requests库的获取,然而这只是开始,你获取了网页的源代码,但是这并不是我们的目的,我们的目的是解析链接里面的信息,比如各种属性  @href  @class span  抑或是p节点里面的文本内容,但是我们需要一种工...
    99+
    2023-01-30
    爬虫 正则表达式 python
  • Python爬虫爬取豆瓣电影之数据提取值
    工具:Python 3.6.5、PyCharm开发工具、Windows 10 操作系统、谷歌浏览器 目的:爬取豆瓣电影排行榜中电影的title、链接地址、图片、评价人数、评分等 网址:https://movie.douban.com/ch...
    99+
    2023-01-30
    爬虫 豆瓣 数据
  • python爬虫之三:解析网络报文xml
    本节主要是讲解在项目中怎么解析获取的xml报文并获取相关字段。 xml解析第三方库学习地址:http://www.runoob.com/python/python-xml.html xml文件如下: <xml versio...
    99+
    2023-01-31
    报文 爬虫 之三
  • 爬虫解析提取数据的方法有哪些
    本篇文章为大家展示了爬虫解析提取数据的方法有哪些,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。 一、分析网页以经典的爬取豆瓣电影 Top250 信息为例。每条电影信息在 ol class ...
    99+
    2023-06-15
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作