一、数据来源
爬取网站是厦门人才网:
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)
结果图:
|