全国美容大夫数据采集数据(花X网 huaroo 公开数据),爬虫120例之26例
【摘要】 本次要抓取的目标网站为【整形医生数据】,其中用到的 queue 模块,需要在 预备知识篇 进行学习。 目标站点数据源分析目标地址为:https://www.huaroo.net/d/pg_1/,爬取数据区域如下图所示:整理目标数据格式为:姓名,所在医院,当前职务,从医时间,擅长项目分页规则如下:
本次要抓取的目标网站为【整形医生数据】,其中用到的 queue 模块,需要在 预备知识篇 进行学习。
目标站点数据源分析
目标地址为:https://www.huaroo.net/d/pg_1/
,爬取数据区域如下图所示:
整理目标数据格式为:
姓名,所在医院,当前职务,从医时间,擅长项目
分页规则如下:
https://www.目标站点.net/d/pg_1/
https://www.目标站点.net/d/pg_2/
其中 pg_页码
为页码跳转规则,可以通过代码爬取获取,也可以直接手动输入。
测试过程中发现网页响应速度有点慢,但是没有反爬措施,顾将请求等待时间设置的长一些即可实现。
编码时间
下述编码中使用到了 queue 模块,即队列机制,不过并没有使用生产者与消费者模型,所谓的生产者直接使用一个循环进行了生成。
线程部分开启了 2 个线程,通过判断队列是否为空,在进行后续的数据请求工作。
每次获取数据完毕之后,都使用 q.task_done()
告知任务完成。
格式化数据使用 lxml
模块进行提取。
import requests
import threading
from queue import Queue
from lxml import etree
import time
import random
# 初始化一个队列
q = Queue(maxsize=0)
# 批量添加数据
for page in range(1, 502):
q.put('https://www.huaroo.net/d/pg_{}/'.format(page))
# 获取头文件,其中的 uas 自行设置
def get_headers():
uas = [
"Mozilla/5.0 (compatible; Baiduspider/2.0; +http://www.baidu.com/search/spider.html)",
"Mozilla/5.0 (compatible; Baiduspider-render/2.0; +http://www.baidu.com/search/spider.html)"
]
ua = random.choice(uas)
headers = {
"user-agent": ua,
"referer": "https://www.baidu.com"
}
return headers
# 格式化数据
def format(text):
element = etree.HTML(text)
# print(element)
article_list = element.xpath('//div[contains(@class,"article_list")]')
# print(article_list)
wait_save_str = ""
# 通过 xpath 提取数据
for article in article_list:
title = article.xpath("./a/div/div[@class='article_title']/text()")[0].strip()
hospital = article.xpath("./a/div/div[@class='hospital_list_content mt10 oh']/div[1]/text()")[0].strip()
duties = article.xpath("./a/div/div[@class='hospital_list_content mt10 oh']/div[2]/text()")[0].strip()
practice = article.xpath("./a/div/div[@class='hospital_list_content mt10 oh']/div[3]/text()")[0].strip()
project = article.xpath("./a/div/div[@class='hospital_list_content mt10 oh']/div[4]/text()")[0].strip()
wait_save_str += f"{title},{hospital},{duties},{practice},{project}\n"
save(wait_save_str)
# 储存数据
def save(wait_save_str):
with open('./医美.csv', 'a+', encoding='utf-8') as f:
f.write(wait_save_str)
print(wait_save_str, "---保存成功")
# 爬虫请求与解析入口
def run():
while q.qsize() > 0:
url = q.get()
# print(url)
q.task_done()
res = requests.get(url=url, headers=get_headers(), timeout=10)
format(res.text)
l = []
for i in range(2):
t = threading.Thread(target=run)
l.append(t)
t.start()
for p in l:
p.join()
print("多线程执行完毕")
q.join()
print("所有线程运行完毕")
代码运行之后,显示如下结果。
【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱:
cloudbbs@huaweicloud.com
- 点赞
- 收藏
- 关注作者
评论(0)