【爬虫修炼和实战】四、bs4/pq/xpath/多线程/多进程——爬取喜马拉雅全站音频数据(进阶篇)

这篇博客介绍了使用bs4, pyquery, xpath进行网站解析,以及通过多进程、多线程提升爬虫效率的方法。博主分享了对喜马拉雅音频数据爬取的优化经验,包括解析库的比较和多线程、多进程的实现策略。" 52688042,5635656,迷宫问题:探索所有可能路径,"['算法', '路径查找', '迷宫生成', '图论', '游戏编程']
摘要由CSDN通过智能技术生成

第三篇记录下学习的一些进阶技能,对喜马拉雅音频爬虫代码做一些改进和优化,主要有以下两点:

1、抓取方式(网站解析):

基础篇大量使用了re正则,各类别和音频之间的所属关系是通过字符串分割来实现的(split函数),本篇尝试用beautifulsoup、xpath和pyquery来遍历和解析网页,三者功能类似,速度比正则要慢(大概,bs4最慢是确定的,不过对小规模爬虫来说也感觉不出来),不过获取信息较为方便(大概,看使用熟练度,那个好用用哪个)。网页结构分析不再赘述,可以参考前一篇文章:

爬取喜马拉雅全站音频数据(基础篇)

2、效率提升(多进程结构优化):

基础篇代码单进程运行,效率较低,尝试使用多进程和多线程两种方式进行优化,并且可以输出进度。

申明:仅做学习用途,暂不贴出源码 

目录

一、常用函数和库

二、bs4/pyqyery/xpath函数实现

总结

实现

所引用库

get_category()

get_album(category_url)

get_m4a(album_url)

三、多进程/多线程

分析

多进程实现

多线程实现

 


一、常用函数和库

Beautiful Soup

pyquery

python lxml xpath

css选择器参考手册

python多进程

多线程

二、bs4/pyqyery/xpath函数实现

总结

这三者功能类似,都能作为网站解析器来使用,相比于requests库的非结构型匹配和查找,熟练使用三者需要对网页结构和HTML有更深的理解,学习三者可以参考上面链接

  1. bs4主要用到的函数有find()和findall(),为准确检索需要输入标签和属性参数,最后通过遍历子节点和获取属性内容来提取信息,缺点是速度较慢(相对来说)
  2. pyquery相比bs4更加灵活,语法较简单,结合css选择器使用,速度也较快,使用时要注意css选择器好像不支持空格的匹配。pyqyery也能get到网页,源码实际调用了urllib库,支撑headers,referer参数请求,但暂未发现如何支持代理参数输入,于是请求网页仍使用requests。
  3. lxml库内置了xpath,通过路径表达式差找,使用时需要准确了解网页结构,解析速度最快。

实现

之前的代码结构不需要改动,可以通用,需要修改的只有获取信息的re正则部分以及数据结构的一些匹配。

需要修改的函数有三个:get_category(),get_album(),get_m4a(),函数规定的输入输出均不变,对数据结构的操作在函数内部实现。

为方便测试,节省时间,之前已获取到可用代理池,直接调用。

所引用库

import os
import re
import requests
from lxml import etree
from pyquery import PyQuery as pq
from bs4 import BeautifulSoup
import json
import random
from xm_sign import get_sign
from ProxySearch import *

get_category()

对应全部分类页面 https://www.ximalaya.com/category/

代码实现如下(三者的数据获取语句都放在了注释中,方便对比和学习,需要参考HTML源码理解),三选一即可,代码中为bs4:

def get_category():
    print('获取目录中...')
    category = list()
    category_url = url_join(root_url, 'category')
    response = get_response(category_url)
    '''
    #pyquery:
    plate_list = pq(response.text)(".category_plate") 
    #beautifulsoup: 
    plate_list = BeautifulSoup(response.text, "lxml").find_all('div', class_="category_plate _AK")
    #xpath:
    plate_list=etree.HTML(response.text).xpath("//div[@class='category_plate _AK']")  # 位置路径表达式查找
    '''
    plate_list = BeautifulSoup(response.text,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值