我們以騰訊社招頁面來做示例:http://hr.tencent.com/position.php?&start=0#a 如上圖,使用BeautifulSoup4解析器,將圖1中229頁,每頁10個招聘信息,共2289個招聘信息中的職位名稱、職位類別、招聘人數、工作地點、工作職責、工作要求、詳情鏈接等 ...
我們以騰訊社招頁面來做示例:http://hr.tencent.com/position.php?&start=0#a
如上圖,使用BeautifulSoup4解析器,將圖1中229頁,每頁10個招聘信息,共2289個招聘信息中的職位名稱、職位類別、招聘人數、工作地點、工作職責、工作要求、詳情鏈接等信息存儲在本地磁碟(如下圖)。
#!/usr/bin/python3 # -*- conding:utf-8 -*- __author__ = 'mayi' """ 案例:使用BeautifulSoup4爬取騰訊招聘頁面的數據 url:http://hr.tencent.com/position.php?&start=10#a 使用BeautifulSoup4解析器,爬取每個招聘詳情頁面裡面的: 職位名稱、工作地點、職位類別、招聘人數、工作職責、工作要求、url鏈接 """ from bs4 import BeautifulSoup import urllib.request import json # 創建一個爬蟲類 class TencentSpider(object): """ 一個爬蟲類:爬取騰訊招聘頁面信息 """ def __init__(self): """ 初始化函數 :return: """ # User-Agent頭 self.header = {'User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/39.0.2171.71 Safari/537.36'} self.url = "http://hr.tencent.com/" self.file_name = open("tencent.txt", "w", encoding = "utf-8") # 爬蟲開始工作 self.run() def run(self): """ 爬蟲開始工作 :return: """ # 首頁 start_page = 1 # 尾頁 end_page = self.getLastPage(self.url + "position.php?&start=0#a") # 迴圈處理每一頁 for page in range(start_page, end_page + 1): print("正在處理第" + str(page) + "頁") # 每一頁有10個招聘信息 pn = (page - 1) * 10 # 接接成完整的url地址 full_url = self.url + "position.php?&start=" + str(pn) + "#a" # 獲取招聘詳情鏈接:l square link_list = self.getPositons(full_url) for link in link_list: # 拼接成完整的鏈接 full_link = self.url + link # 獲取招聘信息頁面里的所需爬取的信息 self.getPositionInfo(full_link) # 關閉文件 self.file_name.close() def getLastPage(self, url): """ 獲取尾頁的page值 :param url: 首頁的url地址 :return: 尾頁的page值 """ # 獲取url頁面的內容:bytes html = self.loadPage(url) # bytes轉utf-8 html = html.decode("utf-8") # 創建 Beautiful Soup 對象,指定lxml解析器 soup = BeautifulSoup(html, "lxml") page_nav = soup.select('div[class="pagenav"]')[0] page = page_nav.find_all('a')[-2].get_text() return int(page) def loadPage(self, url): """ 獲取url頁面的內容 :param url: 需要獲取內容的url地址 :return: url頁面的內容 """ # url 連同 headers,一起構造Request請求,這個請求將附帶 chrome 瀏覽器的User-Agent request = urllib.request.Request(url, headers = self.header) # 向伺服器發送這個請求 response = urllib.request.urlopen(request) # time.sleep(3) # 獲取網頁內容:bytes html = response.read() return html def getPositons(self, url): """ 獲取url頁面內的招聘詳情鏈接 :param url: :return: """ # 獲取url頁面的內容:bytes html = self.loadPage(url) # bytes轉utf-8 html = html.decode("utf-8") # 創建 Beautiful Soup 對象,指定lxml解析器 soup = BeautifulSoup(html, "lxml") item_list = soup.select('td[class="l square"]') link_list = [] for item in item_list: item = item.select('a')[0].attrs['href'] link_list.append(item) return link_list def getPositionInfo(self, url): """ 獲取我們需爬取的信息 :param url: 招聘詳情頁面 :return: None """ # 獲取url頁面的內容:bytes html = self.loadPage(url) # bytes轉utf-8 html = html.decode("utf-8") # 創建 Beautiful Soup 對象,指定lxml解析器 soup = BeautifulSoup(html, "lxml") # 用於存儲所爬取信息的字典 item = {} try: # 職位名稱 position_name = soup.find_all(id="sharetitle")[0].get_text() # 工作地點、職位類型、招聘人數 bottomline = soup.select('tr[class="c bottomline"] td') # 工作地點 working_place = bottomline[0].get_text()[5:] # 職位類別 position_category = bottomline[1].get_text()[5:] # 招聘人數 numbers = bottomline[2].get_text()[5:] # 工作職責 operating_duty_list = soup.select('ul[class="squareli"]')[0].select('li') operating_duty = "" for duty in operating_duty_list: operating_duty += duty.get_text().strip() + "\n" # 工作要求 requirements_list = soup.select('ul[class="squareli"]')[1].select('li') requirements = "" for requ in requirements_list: requirements += requ.get_text().strip() + "\n" # url鏈接 url_links = url # 職位名稱、工作地點、職位類別、招聘人數、工作職責、工作要求、url鏈接 item["職位名稱"] = position_name item["工作地點"] = working_place item["職位類別"] = position_category item["招聘人數"] = numbers item["工作職責"] = operating_duty item["工作要求"] = requirements item["url鏈接"] = url_links except: # 若異常、則捨棄這條信息 pass # 保存這條記錄 if item: line = json.dumps(item, ensure_ascii = False) + "\n" self.file_name.write(line) # 主函數 if __name__ == '__main__': my_spider = TencentSpider()