python爬虫开发实例-爬取通辽当地某网站的招聘信息

二次开发 admin 发布时间:2026-01-12 16:27:05 浏览:
Python的功能很强大,特别是爬虫功能。下面以爬取通辽当地某网站的招聘栏目为例,具体讲解Python爬虫开发的过程。
 
import requests
import re
import time
from urllib.parse import urljoin
from collections import defaultdict

# 配置请求头,模拟浏览器访问
HEADERS = {
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/120.0.0.0 Safari/537.36',
    'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8',
    'Accept-Language': 'zh-CN,zh;q=0.9,en;q=0.8'
}

# 存储已爬取的信息,用于去重
processed_data = defaultdict(str)


def get_page_content(url):
    """
    获取页面内容,处理请求异常
    """
    try:
        response = requests.get(url, headers=HEADERS, timeout=10)
        response.raise_for_status()  # 抛出HTTP错误
        response.encoding = 'utf-8'  # 该网站使用gb2312编码
        return response.text
    except requests.exceptions.RequestException as e:
        print(f"请求页面 {url} 失败: {e}")
        return None


def extract_links(main_url):
    """
    从主页面提取所有招聘详情页链接
    """
    html = get_page_content(main_url)
    if not html:
        return []

    # 匹配详情页链接的正则表达式
    # link_pattern = re.compile(r'href="(\.\./gqxx/showfabus\.asp\?dadid=\d+&fa=4)"')
    link_pattern = re.compile(r'href="([^"]*showfabus\.asp[^"]*)"', re.I)
    links = link_pattern.findall(html)

    # 拼接完整URL
    full_links = [urljoin(main_url, link) for link in links]
    print(f"找到 {len(full_links)} 个招聘详情页链接")
    return full_links


def extract_job_info(html):
    """
    从详情页提取招聘内容和电话号码
    """
    if not html:
        return None, None

    # 提取招聘主要内容(去除多余标签)
    content_pattern = re.compile(r'<span class="sf3">(.*)</span>', re.S)
    content_match = content_pattern.search(html)
    print(content_match)
    job_content = ""
    if content_match:
        # 去除HTML标签
        job_content = re.sub(r'<.*?>', '', content_match.group(1))
        # 去除多余空格和换行
        job_content = re.sub(r'\s+', ' ', job_content).strip()
    print(job_content)
    # 提取电话号码(匹配手机号11位,座机号带区号格式)
    # 第一步:匹配整个区间(兼容中英文括号、多余字符)
    range_pattern = re.compile(r'联系电话[\s\S]*?[(\(]查看归属地[)\)]', re.S)
    range_match = range_pattern.search(html)

    if not range_match:

        phone_str ='空'

    else:
        # 第二步:在区间内提取完整的手机号/座机号(修正后的规则)
        phone_pattern = re.compile(r'1[3-9]\d{9}|0\d{2,3}[-\s]?\d{7,8}')
        phone_list = phone_pattern.findall(range_match.group())
        #print("电话match:" + phone_matches)
        if phone_list:

            print(" | ".join(phone_list))
            # 去重并合并电话号码
            phone_numbers = list(set(phone_list)) if phone_list else []
            phone_str = ' | '.join(phone_numbers) if phone_numbers else "未找到电话号码"
            print("电话:" + phone_str)
        else:
            phone_str = '空'




    return job_content, phone_str


def save_to_file(filename, data):
    """
    将去重后的信息写入文件
    """
    with open(filename, 'w', encoding='utf-8') as f:
        for idx, (phone, content) in enumerate(data.items(), 1):
            f.write(f"======== 招聘信息 {idx} ========\n")
            f.write(f"电话号码: {phone}\n")
            f.write(f"招聘内容: {content}\n")
            f.write("\n" + "-" * 50 + "\n\n")
    print(f"信息已保存到 {filename} 文件,共 {len(data)} 条去重后的招聘信息")


def main():
    # 目标主页面URL
    main_url = "http://www.tlxxw.com/gqxx/showfabu.asp?fa=4"
    # 输出文件名
    output_file = "job.txt"

    # 1. 提取所有详情页链接
    detail_links = extract_links(main_url)
    if not detail_links:
        print("未找到任何招聘详情页链接")
        return

    # 2. 遍历每个链接提取信息
    for idx, link in enumerate(detail_links, 1):

        link = link.replace('&amp;', '&')
        print(f"\n正在爬取第 {idx}/{len(detail_links)} 个链接: {link}")
        html = get_page_content(link)
        # print(html)

        if html:
            job_content, phone = extract_job_info(html)
            print(job_content)
            # 去重:以电话号码为键(无号码则用内容摘要)
            key = phone if phone != "未找到电话号码" else job_content[:50]
            if key and job_content:
                processed_data[key] = job_content

        # 延时1秒,避免请求过快被封IP
        time.sleep(1)

    # 3. 保存去重后的信息到文件
    save_to_file(output_file, processed_data)


if __name__ == "__main__":
    main()

爬取后写入txt文件。下面是结果的一部分内容:

======== 招聘信息 3 ========
电话号码: 1327485672
招聘内容: 同乐发饮用水诚聘配送人员 身体健康,勤奋刻苦,敬业爱岗 保底5000以上加提成 自带电动车,多劳多得 电话:13274856722 15248339633

--------------------------------------------------

======== 招聘信息 4 ========
电话号码: 1874759588
招聘内容: 世纪良缘礼仪公司高薪诚聘: 岗位一:婚礼策划师 工资待遇:4000元―――12000元。 工作描述:向准新人介绍婚礼庆典服务项目,并达成协议.全程策划实施婚礼庆典全过程.有无工作经验均可,公司提供一对一专业培训.要求口才好应变能力强,有敬业精神,有文化底蕴,能长期从事此项工作。有过销售或教师,导游,企划人员等从业经验者。会运用电脑PS者。 岗位二:平面设计师:(熟练使用各种设计类软件。)工资面议。 联系人:18747595885

--------------------------------------------------

======== 招聘信息 5 ========
电话号码: 1556759999
招聘内容: 招聘单位:铂爱美容会馆 招聘岗位:美容师美体师 薪资待遇:月薪5000元 员工待遇:包吃包住 招聘要求:有经验者 联系人:王院长 联系电话:15567599999

--------------------------------------------------

可以看出还有一些瑕疵,比如电话号码少一位。也可以继续增加功能,比如把爬取的内容写入数据库等,可以继续完善。
另外做爬虫主要是对正则表达式要比较熟悉,可以用下面的网站在线调试正则
https://regex101.com/
很方便,可以把网页代码复制进去,然后写正则,会显示匹配结果。

如果需要开发爬虫,可以联系我QQ:804752009 


在线咨询

点击这里给我发消息售前咨询专员

点击这里给我发消息售后服务专员

在线咨询

免费通话

24h咨询:0475-2793529


如您有问题,可以咨询我们的24H咨询电话!

免费通话

微信扫一扫

微信联系
返回顶部