爬取厦门人才网(python爬虫)

Posted 程序员啊楷

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了爬取厦门人才网(python爬虫)相关的知识,希望对你有一定的参考价值。

一、数据来源

爬取网站是厦门人才网:

http://www.xmrc.com.cn/net/info/resultg.aspx?
要爬取的内容包括了相关职业的职位名称、详情链接、招聘公司、参考薪水、工作地点、学历要求以及发布时间

二、导入库

使用urllib.request发送请求 from lxml import etree

通过xpath解析DOM树的时候会使用lxml的etree,可以从html源码中得到想要的内容

所以先导入这两个库

import urllib.request  
from lxml import etree 

三、定义类

定义一个Spider类,也就是爬虫类,在类中除了定义构造方法,再定义一个方法,用来接收html的内容。

class Spider(object):  # 定义一个Spider类
    def __init__(self):  # 构造方法
        # 起始页位置
        self.begin_page = int(input("请输入起始页:"))
        # 终止页位置
        self.end_page = int(input("请输入终止页:"))
        # 基本URL
        self.base_url = "http://www.xmrc.com.cn/net/info/resultg.aspx?"

    def load_page(self):  # 定义一个方法,用来接收html的内容
        """
            @brief 定义一个url请求网页的方法
            @param page 需要请求的第几页
        """
        # 添加User-Agent字段对发出的请求进行伪装
        user_agent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;Trident / 5.0"
        headers = {"User-Agent": user_agent}
        # 找到url的规律循环每一页的内容
        # 第一页是http://www.xmrc.com.cn/net/info/resultg.aspx?=position.php?&start=20&PageIndex=1
        # 第二页是http://www.xmrc.com.cn/net/info/resultg.aspx?=position.php?&start=20&PageIndex=2
        html_list = []  # 用来存放html源码的列表
        for page in range(self.begin_page, self.end_page + 1):
            url = self.base_url + "=position.php?&start=20&PageIndex=" + str(page)
            request = urllib.request.Request(url, headers=headers)
            # 获取每页HTML源码字符串
            response = urllib.request.urlopen(request)
            # 指定utf-8编码格式解码字符串
            html = response.read().decode("utf-8")
            # print(html)  # 用来测试爬取的html是否成功
            html_list.append(html)  # 把每一个html放到一个空列表中,以便后面读取后再解析
        return html_list  # 返回html的列表,里面的每一个元素都是一个html源码

    # 使用lxml库解析网页数据
    def parse_page(self, list):  # 参数list是传入一个html的列表
        """
            @brief      定义一个解析网页的方法
            @param html 服务器返回的网页HTML
        """
        items = []  # 定义空列表,以保存元素的信息
        for every_html in list:  # 依次取出html
            # 从字符串中解析HTML文档或片段,返回根节点
            root = etree.HTML(every_html)
            # 查找所有的职位名称
            names = root.xpath("//tr[@class='bg']/td[2]/a")
            # 查找所有的详情链接
            links = root.xpath("//tr[@class='bg']/td/a/@href")
            # 查找所有的招聘公司
            company = root.xpath("//tr[@class='bg']/td[3]/a")
            # 查找所有的参考薪水
            salary = root.xpath("//tr[@class='bg']/td[5]/a")
            # 查找所有的工作地点
            locations = root.xpath("//tr[@class='bg']/td[4]/a")
            # 查找所有的学历要求
            education = root.xpath("//tr[@class='bg']/td[6]/a")
            # 查找所有的发布时间
            publish_times = root.xpath("//tr[@class='bg']/td[7]/a")
            for i in range(0, len(names)):  # 循环一共有多少个职位的次数
                item = {}  # 创建空字典
                # 写入键值对,通过lxml库解析网页的数据填入对应的值,并使用.strip()去掉空格
                item["职位名称"] = names[i].text.strip()
                item["详情链接"] = self.base_url + links[i]
                item["招聘公司"] = company[i].text.strip()
                item["参考薪水"] = salary[i].text.strip()
                item["工作地点"] = locations[i].text.strip()
                item["学历要求"] = education[i].text.strip()
                item["发布时间"] = publish_times[i].text.strip()
                items.append(item)
        # print(len(items))   # 用来测试数据条数是否正确,一个页面是30条数据,依次类推
        return items  # 返回列表,列表的每一个元素是一个招聘的字典

    def save_file(self, items):  # 把字典里的数据保存到一个txt文件中
        """
            @brief       将数据追加写进文件中

            @param html 文件内容
        """
        file = open('tencent.txt', "wb+")  # 打开文件,以二进制的方式写入
        file.write(str(items).encode())  # 写入数据
        file.close()  # 关闭文件

以上注释里都写得很详细,可以适当内容,爬取自己想要的数据

下面附上完整的代码:

# coding=utf-8
import urllib.request  # 使用urllib.request发送请求
from lxml import etree  # 通过xpath解析DOM树的时候会使用lxml的etree,可以从html源码中得到想要的内容


class Spider(object):  # 定义一个Spider类
    def __init__(self):  # 构造方法
        # 起始页位置
        self.begin_page = int(input("请输入起始页:"))
        # 终止页位置
        self.end_page = int(input("请输入终止页:"))
        # 基本URL
        self.base_url = "http://www.xmrc.com.cn/net/info/resultg.aspx?"

    def load_page(self):  # 定义一个方法,用来接收html的内容
        """
            @brief 定义一个url请求网页的方法
            @param page 需要请求的第几页
        """
        # 添加User-Agent字段对发出的请求进行伪装
        user_agent = "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1;Trident / 5.0"
        headers = {"User-Agent": user_agent}
        # 找到url的规律循环每一页的内容
        # 第一页是http://www.xmrc.com.cn/net/info/resultg.aspx?=position.php?&start=20&PageIndex=1
        # 第二页是http://www.xmrc.com.cn/net/info/resultg.aspx?=position.php?&start=20&PageIndex=2
        html_list = []  # 用来存放html源码的列表
        for page in range(self.begin_page, self.end_page + 1):
            url = self.base_url + "=position.php?&start=20&PageIndex=" + str(page)
            request = urllib.request.Request(url, headers=headers)
            # 获取每页HTML源码字符串
            response = urllib.request.urlopen(request)
            # 指定utf-8编码格式解码字符串
            html = response.read().decode("utf-8")
            # print(html)  # 用来测试爬取的html是否成功
            html_list.append(html)  # 把每一个html放到一个空列表中,以便后面读取后再解析
        return html_list  # 返回html的列表,里面的每一个元素都是一个html源码

    # 使用lxml库解析网页数据
    def parse_page(self, list):  # 参数list是传入一个html的列表
        """
            @brief      定义一个解析网页的方法
            @param html 服务器返回的网页HTML
        """
        items = []  # 定义空列表,以保存元素的信息
        for every_html in list:  # 依次取出html
            # 从字符串中解析HTML文档或片段,返回根节点
            root = etree.HTML(every_html)
            # 查找所有的职位名称
            names = root.xpath("//tr[@class='bg']/td[2]/a")
            # 查找所有的详情链接
            links = root.xpath("//tr[@class='bg']/td/a/@href")
            # 查找所有的招聘公司
            company = root.xpath("//tr[@class='bg']/td[3]/a")
            # 查找所有的参考薪水
            salary = root.xpath("//tr[@class='bg']/td[5]/a")
            # 查找所有的工作地点
            locations = root.xpath("//tr[@class='bg']/td[4]/a")
            # 查找所有的学历要求
            education = root.xpath("//tr[@class='bg']/td[6]/a")
            # 查找所有的发布时间
            publish_times = root.xpath("//tr[@class='bg']/td[7]/a")
            for i in range(0, len(names)):  # 循环一共有多少个职位的次数
                item = {}  # 创建空字典
                # 写入键值对,通过lxml库解析网页的数据填入对应的值,并使用.strip()去掉空格
                item["职位名称"] = names[i].text.strip()
                item["详情链接"] = self.base_url + links[i]
                item["招聘公司"] = company[i].text.strip()
                item["参考薪水"] = salary[i].text.strip()
                item["工作地点"] = locations[i].text.strip()
                item["学历要求"] = education[i].text.strip()
                item["发布时间"] = publish_times[i].text.strip()
                items.append(item)
        # print(len(items))   # 用来测试数据条数是否正确,一个页面是30条数据,依次类推
        return items  # 返回列表,列表的每一个元素是一个招聘的字典

    def save_file(self, items):  # 把字典里的数据保存到一个txt文件中
        """
            @brief       将数据追加写进文件中

            @param html 文件内容
        """
        file = open('tencent.txt', "wb+")  # 打开文件,以二进制的方式写入
        file.write(str(items).encode())  # 写入数据
        file.close()  # 关闭文件


if __name__ == '__main__':  # 主函数,程序的入口
    # 测试正则表达式/ lxml库/ bs4库
    spider = Spider()  # 创建Spider的对象
    html_list = spider.load_page()  # 调用load_page()返回赋给html_list
    return_items = spider.parse_page(html_list)  # 调用parse_page()返回赋给return_items
    # 调用save_file()把数据保存到文件中
    spider.save_file(return_items)

结果图:

以上是关于爬取厦门人才网(python爬虫)的主要内容,如果未能解决你的问题,请参考以下文章

scrapy主动退出爬虫的代码片段(python3)

python爬虫学习教程之兼职网数据爬取

Python 利用爬虫爬取网页内容 (div节点的疑惑)

python爬虫 | 一条高效的学习路径

Python爬虫 - 爬取百度html代码前200行

如何用30行代码爬取Google Play 100万个App的数据