標題無心冒犯,就是以爲這個廣告挺好玩的php
前期回顧:你要偷偷學Python(第十四天)html
第十四天講了Xpath,是真的好用啊。
因而我就去親自練習了一下,抓取「2021騰訊校招網」數據,並進行整理。python
這篇屬於一套新系列,掛在「偷偷學Python」系列下,寫完以後會整理出來。瀏覽器
名字想好了,就叫「爬蟲百戰穿山甲」。網絡
插播一條推送:(若是是小白的話,能夠看一下下面這一段)app
我建了一個Python學習答疑羣,有興趣的朋友能夠了解一下:若是你們在學習中遇到困難,想找一個python學習交流環境,能夠加入咱們的python圈,裙號1160381299,可領取python學習資料,會節約不少時間,減小不少遇到的難題。函數
本系列文默認各位有必定的C或C++基礎,由於我是學了點C++的皮毛以後入手的Python。 本系列文默認各位會百度。 而後呢,本系列的目錄嘛,說實話我我的比較傾向於那兩本 Primer Plus,因此就跟着它們的目錄結構吧。 本系列也會着重培養各位的自主動手能力,畢竟我不可能把全部知識點都給你講到,因此本身解決需求的能力就尤其重要,因此我在文中埋得坑請不要把它們當作坑,那是我留給大家的鍛鍊機會,請各顯神通,自行解決。
https://join.qq.com/post.php?pid=1post
點進去看,咱們繼續下一步。學習
先看頁面左側,有四個標籤,姑且叫它們「大標題」,用於開闢Excel工做區。網站
再看頁面中上部分,有很多的小標籤:
這些小標籤下屬有三種不一樣的狀況:下拉框、文本框、暫無崗位:
先看一下左邊標籤的Xpath,這個沒有什麼很難的問題,可是對於我這種小白來講仍是有點難的。
/html/body/div[2]/div[2]/div[1]/ul[1]/li[1]/a
這個是絕對路徑啊,也能夠用相對路徑,//div[2]/div[2]/div[1]/ul[1]/li[1]/a
那要怎麼去一次性全提取出來嘞?
/html/body/div[2]/div[2]/div[1]/ul[1]//li//a//@href /html/body/div[2]/div[2]/div[1]/ul[1]//li//a//text()
這一步跨出去就好辦了,跨不過去的話建議先回「第十四天」再看看。
上邊那些小模塊的Xpath我就不說了啊,一個套路啦。
講一下那些個下拉框吧,這個下拉框有這麼幾種狀況:
一、這是有下拉框的:/html/body/div[2]/div[2]/div[2]/div[2]/div[1]/div[2]/div/ul/a[1]
二、這是沒有下拉框可是有內容的:/html/body/div[2]/div[2]/div[2]/div[2]/div[1]/div[2]/div/span
剩下那個我也沒去看。
我是這樣作的:去抓全部的框,有網址的就是有下拉框,沒網址的就是沒下拉框。什麼都沒有的就是空的,空的無論它。
一樣的,實現了基本功能,並無最終完善和重構,先結項,太忙。
不過這個項目我很喜歡,後面會繞回來再完善一遍。
很少說,思路
from openpyxl import Workbook import requests import re from lxml import etree #獲取網址中的element對象 def get_data(url,headers): response = requests.get(url, headers) data = response.content #print("data\n"+data) #刪除源代碼中的註釋 data = data.decode().replace("<!--", "").replace("-->", "") #print(data) # 建立element對象 tree = etree.HTML(data) #print("tree\n"+tree) return tree def parser_href_data(url_base,Tree,Xpath): el_list = Tree.xpath(Xpath) el_list_keep = [] for i in el_list: el_list_keep.append(url_base + str(i)) return el_list_keep def run(): wb = Workbook() # 打開一個excel文件 url_base = "https://join.qq.com/" # 通用網址頭 headers = { # 假裝請求頭 # 高端瀏覽器 有註釋 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36" } # 首先訪問主頁 tree = get_data("https://join.qq.com/post.php?pid=1",headers) el_list1 = parser_href_data(url_base,tree,"/html/body/div[2]/div[2]/div[1]/ul[1]//@href") el_list2 = parser_href_data('',tree,"/html/body/div[2]/div[2]/div[1]/ul[1]//li/a/text()") # for i in el_list1: # print(i) # for j in el_list2: # print(j) #進入每一個大標籤 for x,y in zip(el_list1,el_list2): y = y.replace('/','&') #這裏要再次賦值,並不是原地修改 ws = wb.create_sheet(y) #這裏不接受'/' tree = get_data(x,headers) el_list3 = parser_href_data(url_base, tree, "/html/body/div[2]/div[2]/div[2]/div[1]/ul//a/@href") el_list4 = parser_href_data('', tree, "/html/body/div[2]/div[2]/div[2]/div[1]/ul//a//text()") #進入每一個小標籤 for i,j in zip(el_list3,el_list4): write_to_sheet = [] #這個應該放這裏 write_to_sheet.append(j) # print(j+":"+i) # print("\n") tree = get_data(i,headers) #找找看有沒有下拉框 el_list5 = parser_href_data(url_base, tree, "/html/body/div[2]/div[2]/div[2]/div[2]/div[1]/div[2]/div/ul//a/@href") #若是沒有下拉框 if el_list5 == []: #從列表來區分,字符串區分不了,==‘’不行,isspace也不行 #直接抓數據 #print("None") #抓取崗位名稱 el_list6 = parser_href_data('',tree,"/html/body/div[2]/div[2]/div[2]/div[2]/div[1]/div[2]/div/span//text()") #清除空崗位 if el_list6 != []: # print(el_list6) #抓取崗位介紹 write_to_sheet.append(el_list6[0]) el_list7 = parser_href_data('',tree,"/html/body/div[2]/div[2]/div[2]/div[2]/div[2]/div[2]//text()") ss = '' for s in el_list7: s.replace('\r\n',' ') #print(s) ss=ss+s+'\n' write_to_sheet.append(ss) #抓取崗位需求 el_list8 = parser_href_data('', tree,"/html/body/div[2]/div[2]/div[2]/div[2]/div[3]/div[2]//text()") ss = '' for s in el_list8: s.replace('\r\n',' ') # print(s) ss = ss + s + '\n' write_to_sheet.append(ss) #抓取工做地點 el_list9 = parser_href_data('', tree,"/html/body/div[2]/div[2]/div[2]/div[2]/div[4]/div[2]//text()") ss = '' for s in el_list9: #不正則一下還真覺得我怕了它 pat = re.compile(r'[\u4e00-\u9fa5]+') result = pat.findall(s) for s in result: ss = ss + s + '、' write_to_sheet.append(ss) #抓取招聘城市 el_list10 = parser_href_data('', tree,"/html/body/div[2]/div[2]/div[2]/div[2]/div[5]/div[2]//text()") for s in el_list10: s.strip() write_to_sheet.append(s) ws.append(write_to_sheet) else: el_list6 = parser_href_data('', tree,"/html/body/div[2]/div[2]/div[2]/div[2]/div[1]/div[2]/div/ul//a//text()") for a,b in zip(el_list5,el_list6): pass #再往下走一層抓數據 # if a.isspace(): # print("None") # else: # print(j + ":" + i) # print("hellohello\n\n") wb.save("2021騰訊校招崗位.xlsx") wb.close() run()
日後的部分就交給各位啦。
我作這些的過程當中,發現重複度有點高,若是要封裝成類進行重構的話能夠考慮一下「模板方法模式」,不要生搬硬套到函數裏面。
最後多說一句,想學習Python可聯繫小編,這裏有我本身整理的整套python學習資料和路線,想要這些資料的均可以進q裙1160381299領取。
本文章素材來源於網絡,若有侵權請聯繫刪除。