「这是我参与11月更文挑战的第14天,活动详情查看:2021最后一次更文挑战」
本篇博客的最终目标是爬取世界上 9139 位艺人的身高、体重、生日、血型,当然有些数据目标网站没有提供,不在做过多的扩展。
爬取前的分析工作
目标网址为:www.ylq.com/star/list-a…,数据量在 9000+位艺人,单纯从数据上看量不是很大,合计 153 页数据。
页面未通过接口返回数据,查看页面源码即可看到。
列表页对应的数据如下图:
从图片中可以看到内页地址,头像图片,姓名这些直观数据。点击进入内页,对应的数据如下图所示。
整理爬取思路为,通过列表页面抓取所有的艺人内页,然后进入内页之后获取详细,将详细数据存档即可完成本案例。
编码时间
单线程爬取
本案例涉及的所有模块可以优先导入
1 | python复制代码import requests |
对于页面的获取与解析相对比较简单,优先对这部分做出说明。
1 | python复制代码flag_page = 0 |
上述代码说明:
- 本案例会利用到简单的多线程操作,所以提前声明一个全局变量
flag_page
方便后续使用 - 正则表达式需要的反复练习,如果无法一次完整匹配,可以采用多次匹配的方式进行
优化成多线程模式
从现在的代码修改为多线程非常简单,只需要修改函数调用部分的代码即可。具体如下:
1 | python复制代码if __name__ == "__main__": |
循环创建 5 个线程,每个线程的名字设置为 tn
,线程的初始化与使用代码如下:
1 | python复制代码 t = threading.Thread(target=get_list) # 初始化 |
此时代码会同时并发 5 个线程,速度会有极大的提高。
抓取内页
在每个线程获取到数据之后,就可以对内页进行分析了,从上面获取到的解析数据中提取出内页链接。
1 | python复制代码# 获取页面中的所有艺人 |
接下来扩展 get_detail
函数,该部分主要为正则表达式的应用,函数具体内容如下:
1 | python复制代码def get_detail(detail_url): |
上述内容会将匹配到的数据返回给主函数,代码运行之后,就可以打印出我们想要的信息了。
最后,只需要将数据存在本地的 csv 文件即可,完整代码参照:
1 | python复制代码import requests,re,json,threading,csv,codecs,time |
数据说明
数据爬取到本地为 500KB
整理量不大,存在很多不详,如果你想要该份数据用于分析,直接运行上述代码即可成功。
代码中需要特别注意的是正则的泛应用,csv 文件的存储(带列头),简单多线程的应用。
本文转载自: 掘金