第三篇记录下学习的一些进阶技能,对喜马拉雅音频爬虫代码做一些改进和优化,主要有以下两点:
1、抓取方式(网站解析):
基础篇大量使用了re正则,各类别和音频之间的所属关系是通过字符串分割来实现的(split函数),本篇尝试用beautifulsoup、xpath和pyquery来遍历和解析网页,三者功能类似,速度比正则要慢(大概,bs4最慢是确定的,不过对小规模爬虫来说也感觉不出来),不过获取信息较为方便(大概,看使用熟练度,那个好用用哪个)。网页结构分析不再赘述,可以参考前一篇文章:
2、效率提升(多进程结构优化):
基础篇代码单进程运行,效率较低,尝试使用多进程和多线程两种方式进行优化,并且可以输出进度。
申明:仅做学习用途,暂不贴出源码
目录
一、常用函数和库
二、bs4/pyqyery/xpath函数实现
总结
这三者功能类似,都能作为网站解析器来使用,相比于requests库的非结构型匹配和查找,熟练使用三者需要对网页结构和HTML有更深的理解,学习三者可以参考上面链接。
- bs4主要用到的函数有find()和findall(),为准确检索需要输入标签和属性参数,最后通过遍历子节点和获取属性内容来提取信息,缺点是速度较慢(相对来说)
- pyquery相比bs4更加灵活,语法较简单,结合css选择器使用,速度也较快,使用时要注意css选择器好像不支持空格的匹配。pyqyery也能get到网页,源码实际调用了urllib库,支撑headers,referer参数请求,但暂未发现如何支持代理参数输入,于是请求网页仍使用requests。
- 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,