全国美容大夫数据采集数据(花X网 huaroo 公开数据),爬虫120例之26例

举报
梦想橡皮擦 发表于 2022/01/12 13:47:55 2022/01/12
【摘要】 本次要抓取的目标网站为【整形医生数据】,其中用到的 queue 模块,需要在 预备知识篇 进行学习。 目标站点数据源分析目标地址为:https://www.huaroo.net/d/pg_1/,爬取数据区域如下图所示:整理目标数据格式为:姓名,所在医院,当前职务,从医时间,擅长项目分页规则如下:

本次要抓取的目标网站为【整形医生数据】,其中用到的 queue 模块,需要在 预备知识篇 进行学习。

目标站点数据源分析

目标地址为:https://www.huaroo.net/d/pg_1/,爬取数据区域如下图所示:

image.png

整理目标数据格式为:

姓名,所在医院,当前职务,从医时间,擅长项目

分页规则如下:

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("所有线程运行完毕")

代码运行之后,显示如下结果。

image.png

【版权声明】本文为华为云社区用户原创内容,未经允许不得转载,如需转载请自行联系原作者进行授权。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。