【数据采集】python爬虫进阶学习——聚焦爬虫(纯干货)

本篇文章涉及到数据解析方面的知识(聚焦爬虫)

在看这篇文章之前,建议读者有一定的爬虫相关的基础知识,零基础的同学请移步

  • 半小时学会python爬虫

以下是本篇文章正文内容,建议使用PyCharm等工具进行实践

文章目录

  • 1 引入
  • 2 正则表达式解析
    • 2.1 实战:糗事百科图片数据爬取
      • 爬一张图片试一试
      • 爬取第一页所有的图片
      • 爬取所有页数的图片
  • 3 bs4解析
    • 3.1 环境安装
    • 3.2 bs4的数据解析原理
    • 3.3 BeatuifulSoup对象的实例化
    • 3.4 BeautifulSoup对象的属性和方法
    • 3.5 实战:爬取小说所有的章节的内容
  • 4 xpath解析
    • 4.1 原理
    • 4.2 环境安装
    • 4.3 实例化对象
    • 4.4 调用xpath方法捕获数据
    • 4.5 实战:爬取58二手房的房源信息
    • 4.6 实战:解析下载图片数据
    • 4.7 实战:爬取全国城市名称

1 引入

1、聚焦爬虫

大多数情况下的需求,我们都会指定去使用聚焦爬虫,也就是爬取页面中指定部分的数据值,而不是整个页面的数据。

2、数据解析的分类:

  • 正则表达式
  • bs4解析
  • xpath解析(重点)

3、数据爬取的流程可以修改为:

  • 指定url
  • 发起请求
  • 获取响应数据
  • 数据解析
  • 持久化存储

4、数据解析原理

解析的局部的文本内容都会在标签之间或者标签对应的属性中进行存储

因此,数据解析的步骤如下:

  1. 进行指定标签的定位
  2. 标签或标签对应的属性中存储的数据值进行提取(解析)

2 正则表达式解析

正则表达式的相关内容可以自行学习一下,不用背,会查就行

下面直接开始实战

2.1 实战:糗事百科图片数据爬取

1、需求

爬取糗事百科中热图模块下的所有图片

地址:https://www.qiushibaike.com/imgrank/

2、分析

  • 所有的图片都是有图片地址的

  • 使用content可以存储二进制文件(图片,见下编码1)

  • 进行通用爬虫,可以发现src在元素img中
    【数据采集】python爬虫进阶学习——聚焦爬虫(纯干货)_第1张图片

  • 进行聚焦爬虫,获取src路径,正则表达式如下:
    ex='

    .*?'

3、编码

爬一张图片试一试

首先,可以先试一试爬一张图片,代码如下:

import requests
if __name__ == "__main__" :
    # UA伪装
    headers = {
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
    }

	# 指定图片的URL
    url = 'https://pic.qiushibaike.com/system/pictures/12383/123839033/medium/U1LTJQIQJDP8TCKP.jpg'
    
    # 发起请求,携带参数
    requests.get(url=url,headers=headers)
    
    # 获取响应对象
    response = requests.get(url=url,headers=headers)
    
    # 获取响应数据,content返回二进制形式的图片
    jpg = response.content
    
    with open('./a.jpg','wb')as fp:
        fp.write(jpg)

爬取第一页所有的图片

代码如下:

注意看注释

import requests
import re 
import os

if __name__ == "__main__" :
    
    # 创建一个文件夹,保存图片
    if not os.path.exists('./图片'):
        os.mkdir('./图片')
        
    # UA伪装
    headers = {
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
    }

	# 指定URL
    url = 'https://www.qiushibaike.com/imgrank/'
    
    # 通用爬虫对整张页面进行爬取
    # 发起请求,携带参数
    requests.get(url=url,headers=headers)
    # 获取响应对象
    response = requests.get(url=url,headers=headers)
    # 获取响应数据
    page_text = response.text
    
    # 使用聚焦爬虫,取出所有的图片
    ex='
.*?' img_src_list = re.findall(ex,page_text,re.S) for src in img_src_list: # 拼接出一个完整的图片地址 src = 'https:'+src # 请求到图片的二进制数据 img_data = requests.get(url = src,headers=headers).content # 生成图片名称,从原始的地址中切分出来 img_name = src.split('/')[-1] # 图片存储的路径 img_path = './图片/'+img_name # 持久化存储 with open(img_path,'wb')as fp: fp.write(img_data)

爬取所有页数的图片

代码如下,与上一段代码进行对比:

import requests
import re 
import os

if __name__ == "__main__" :
    
    # 创建一个文件夹,保存图片
    if not os.path.exists('./所有图片'):
        os.mkdir('./所有图片')
        
    # UA伪装
    headers = {
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
    }

	# 指定URL模版
    url = 'https://www.qiushibaike.com/imgrank/page/%d/'
    
    for pageNum in range(1,14):
        # 对应页面的url
        new_url = format(url%pageNum)
        
        # 通用爬虫对整张页面进行爬取
        # 发起请求,携带参数
        requests.get(url=url,headers=headers)
        # 获取响应对象
        response = requests.get(url=new_url,headers=headers)
        # 获取响应数据
        page_text = response.text
    
    # 使用聚焦爬虫,取出所有的图片
    ex='
.*?' img_src_list = re.findall(ex,page_text,re.S) for src in img_src_list: # 拼接出一个完整的图片地址 src = 'https:'+src # 请求到图片的二进制数据 img_data = requests.get(url = src,headers=headers).content # 生成图片名称,从原始的地址中切分出来 img_name = src.split('/')[-1] # 图片存储的路径 img_path = './所有图片/'+img_name # 持久化存储 with open(img_path,'wb')as fp: fp.write(img_data)

3 bs4解析

3.1 环境安装

 1. 需要将pip源设置为国内源,阿里源、豆瓣源、网易源等
 2. windows
    (1)打开文件资源管理器(文件夹地址栏中)2)地址栏上面输入 %appdata%3)在这里面新建一个文件夹  pip
    (4)在pip文件夹里面新建一个文件叫做  pip.ini ,内容写如下即可
        [global]
        timeout = 6000
        index-url = https://mirrors.aliyun.com/pypi/simple/
        trusted-host = mirrors.aliyun.com
 3. linux
    (1)cd ~2)mkdir ~/.pip
    (3)vi ~/.pip/pip.conf
    (4)编辑内容,和windows一模一样
 4. 需要安装:pip install bs4
     bs4在使用时候需要一个第三方库,把这个库也安装一下
     pip install lxml

3.2 bs4的数据解析原理

  • 实例化一个BeatuifulSoup对象,并且将页面源码数据加载到该对象中
  • 通过调用对象的相关属性或者方法解析标签定位和数据提取

3.3 BeatuifulSoup对象的实例化

from bs4 import BeautifulSoup

# 1、将本地的html文档中的数据加载到该对象中
fp = open('./test.html',encoding=utf-8)
soup = Beautiful(fp,'lxml')

# 2、将互联网上的html文档中的数据加载到该对象中
page_text = response.text
soup = BeautifulSoup(page_text,'lxml')

3.4 BeautifulSoup对象的属性和方法

1、soup.tagName

# 返回html中第一次出现的tagname标签
soup.a
soup.div

2、soup.find()

# soup.find('tagname'),返回的和soup.tagname一样
soup.find('div')

# soup.find('tagname',class_/id/attr='')
soup.find('div',class_'song')

3、soup.find_all()

# soup.find_all('tagname'),返回所有符合要求的标签(列表)
soup.find_all('a')

4、soup.select()

# 返回一个列表,选择器包括id选择器,类选择器、标签选择器
soup.select('.classname')

# 层级选择器,> 表示一个层级
soup.select('.classname > ul > li > a')

# 层级选择器,空格表示多个层级
soup.select('.classname > ul a')

5、获取标签之间的文本数据

# 获取a标签的文本数据,text、string、get_text()

# text和get_text()可以获取标签下的所有的文本内容,即使不属于直系内容
soup.a.text
soup.a.get_text()

# string只可以获取该标签下直系的文本内容
soup.a.string

6、获取标签中的属性值

soup.a['属性名称']

3.5 实战:爬取小说所有的章节的内容

1、需求

爬取三国演义小说所有的章节标题和内容

http://www.shicimingju.com/book/sanguoyanyi.html

2、分析

  • 先使用通用爬虫,可以看到a标签的href对应的是链接,内容为章节的标题
    【数据采集】python爬虫进阶学习——聚焦爬虫(纯干货)_第2张图片

  • 使用聚焦爬虫获取标题所对应的内容
    【数据采集】python爬虫进阶学习——聚焦爬虫(纯干货)_第3张图片

3、编码

import requests
import re
import os
from bs4 import BeautifulSoup

if __name__ == "__main__":

    # UA伪装
    headers = {
        'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
    }

    # 对首页数据进行爬取
    url = 'https://www.shicimingju.com/book/sanguoyanyi.html'

    # 获取数据
    page_text = requests.get(url=url, headers=headers).text

    # 在首页中解析出章节的标题和详情页的url
    # 1、实例化
    soup = BeautifulSoup(page_text, 'lxml')
    # 2、解析标题和url
    li_list = soup.select('.book-mulu > ul > li')
    # 打开文件
    fp = open('./sanguo.txt', 'w', encoding='utf-8')
    for li in li_list:
        # 获取a标签的标题和href
        title = li.a.string
        detail_url = 'https://www.shicimingju.com' + li.a['href']
        # 对详情页发起请求
        detail_page_text = requests.get(url=detail_url, headers=headers).text
        # 解析章节的内容
        detail_soup = BeautifulSoup(detail_page_text, 'lxml')
        dic_tag = detail_soup.find('div', class_='chapter_content')
        # 获取到了内容
        content = dic_tag.text
        # 持久化存储
        fp.write(title + ':' + content + '\n')

4 xpath解析

4.1 原理

XPath具有十分强大的选择功能,有一百多种内置函数,几乎可以对我们所有需要选择的节点的内容匹配和节点处理提供支持。

最通用的数据解析方式

原理:

  1. 实例化etree对象,且需要将被解析的页面源码数据加载到该对象中
  2. 调用etree对象中的xpath方法结合着xpath表达式实现标签的定位和内容的捕获

4.2 环境安装

pip install lxml

4.3 实例化对象

from lxml import etree
  1. 将本地的html文档中的源码数据加载到etree对象中
etree.parse(filepath)
  1. 将从互联网上获取的源码数据加载到该对象中
etree.HTML('page_text')

4.4 调用xpath方法捕获数据

xpath('xpath表达式')

常用xpath表达式

# 实例化一个etree对象
tree = etree.parse('./a.html')

# 定位标签	返回列表,存储了element类型对象(一个或多个)
r = tree.xpath('/html/head/title') # ‘/’表示从根节点开始定位,一个层级
r = tree.xpath('/html//title')  # '//'表示多个层级
r = tree.xpath('//title') # 表示从任意位置定位title标签

# 定位属性	返回列表,写法:标签[@属性=“属性值”]
r = tree.xpath('//div[@class="a"]') # 定位到class为a的所有div

# 索引定位	返回列表,索引从1开始
r = tree.xpath('//div[@class="a"]/p[3]')#定位到class为a的div下的第三个p标签 

# 取文本1		返回列表,写法:标签/text()获取直系文本内容
r = tree.xpath('//div[@class="a"]//li[1]/a/text()')

# 取文本2		返回列表,写法:标签//text() 获取所有的文本内容
r = tree.xpath('//div[@class="a"]//li[1]//text')

# 取属性		返回列表,写法:标签/@属性名称
r = tree.xpath('//div[@class="a"]/img/@src')

注意:/表示根标签,./表示当前标签

4.5 实战:爬取58二手房的房源信息

1、需求

爬取58二手房的房源信息

https://sy.58.com/ershoufang/?utm_source=market&spm=u-2d2yxv86y3v43nkddh1.BDPCPZ_BT&PGTID=0d100000-000b-cda5-35a9-c4d948f85c33&ClickID=2

2、编码

import requests
import re 
from lxml import etree

if __name__ == "__main__" :
    
    # UA伪装
    headers = {
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
    }

	# 指定url
    url = 'https://sy.58.com/ershoufang/'
    
    # 获取页面数据
    page_text = requests.get(url = url,headers=headers).text
    
    # 数据解析
    # 1、实例化
    tree = etree.HTML(page_text)
    # 2、调用xpath定位li标签
    li_list = tree.xpath('//ul[@class="house-list-wrap"]/li')
    # 3、获取a标签
    fp = open('58.txt','w',encoding='utf-8')
    for li in li_list:
        title = li.xpath('./div[2]/h2/a/text()')[0]
        fp.write(title)

4.6 实战:解析下载图片数据

1、需求

解析下载图片数据

http://pic.netbian.com/4kqiche/

2、编码

注意:这个网站可能被爬了太多次,已经设置了防护措施,所以这里其实是爬不了的,大家看代码学习一下方法就好。

import requests
import re 
import os
from lxml import etree

if __name__ == "__main__" :
    
    # 创建一个文件夹,保存图片
    if not os.path.exists('./所有图片'):
        os.mkdir('./所有图片') 
        
    # UA伪装
    headers = {
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
    }

	# 指定url
    url = 'http://pic.netbian.com/4kqiche/'
    
    # 获取页面数据
    response = requests.get(url = url,headers=headers)
#     response.encoding = 'utf-8'
    page_text = response.text
    
    # 数据解析
    # 1、实例化
    tree = etree.HTML(page_text)
    # 2、调用xpath定位
    li_list = tree.xpath('//ul[@class="clearfix"]/li')
    # 3、获取src属性值
    for li in li_list:
        src = 'http://pic.netbian.com'+li.xpath('./a/img/@src')[0]
        title = li.xpath('./a/img/@alt')[0]+'.jpg'
        title = title.encode('iso-8859-1').decode('gbk')
        # 持久化存储
        img_data = requests.get(url = src,headers=headers).content
        img_path = '所有图片/'+title
        with open (img_path,'wb')as fp:
            fp.write(img_data)

4.7 实战:爬取全国城市名称

1、需求

爬取全国城市的名称

https://www.aqistudy.cn/historydata/

2、编码

import requests
import re 
import os
from lxml import etree

if __name__ == "__main__" :
        
    # UA伪装
    headers = {
        'User-Agent':'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_6) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/14.0.1 Safari/605.1.15'
    }

	# 指定url
    url = 'https://www.aqistudy.cn/historydata/'
    
    # 获取页面数据
    response = requests.get(url = url,headers=headers)
    page_text = response.text
    
    # 数据解析
    # 1、实例化
    tree = etree.HTML(page_text)
    # 2、调用xpath定位
    li_list_h = tree.xpath('//div[@class="hot"]/div[2]/ul/li')
    li_list_c = tree.xpath('//div[@class="all"]/div[2]/ul')
    city = []
    # 3、获取
    for li in li_list_h:
        host_city_name = li.xpath('./a/text()')[0]
        city.append(host_city_name)
        
    for li in li_list_c:
        all_city_name_li = li.xpath('./div[2]/li')
        for lii in all_city_name_li:
            all_city_name = lii.xpath('./a/text()')[0]
            city.append(all_city_name)
        
    print(city)
    

结果:
【数据采集】python爬虫进阶学习——聚焦爬虫(纯干货)_第4张图片

你可能感兴趣的:(大数据相关技术汇总,python,爬虫)