你要偷偷的學Python,然後驚呆所有人(第十五天)
標題無意冒犯,就是覺得這個廣告挺好玩的
文章目錄
- 前言
- 歡迎來到我們的圈子
- 爬蟲百戰穿山甲(二):Xpath爬取2021年騰訊校招網
- 需求分析
- 目標網站
- 頁面分析
- Xpath分析
- 放碼過來
前言
前期回顧:你要偷偷學Python(第十四天)
第十四天講了Xpath,是真的好用啊。
於是我就去親自練習了一下,抓取“2021騰訊校招網”資料,並進行整理。
這篇屬於一套新系列,掛在“偷偷學Python”系列下,寫完之後會整理出來。
名字想好了,就叫“爬蟲百戰穿山甲”。
插播一條推送:(如果是小白的話,可以看一下下面這一段)
歡迎來到我們的圈子
我建了一個Python學習答疑群,有興趣的朋友可以瞭解一下:如果大家在學習中遇到困難,想找一個python學習交流環境,可以加入我們的python圈,裙號1160381299,可領取python學習資料,會節約很多時間,減少很多遇到的難題。
本系列文預設各位有一定的C或C++基礎,因為我是學了點C++的皮毛之後入手的Python。
本系列文預設各位會百度。
然後呢,本系列的目錄嘛,說實話我個人比較傾向於那兩本 Primer Plus,所以就跟著它們的目錄結構吧。
本系列也會著重培養各位的自主動手能力,畢竟我不可能把所有知識點都給你講到,所以自己解決需求的能力就尤為重要,所以我在文中埋得坑請不要把它們看成坑,那是我留給你們的鍛鍊機會,請各顯神通,自行解決。
爬蟲百戰穿山甲(二):Xpath爬取2021年騰訊校招網
需求分析
目標網站
https://join.qq.com/post.php?pid=1
點進去看,我們繼續下一步。
頁面分析
先看頁面左側,有四個標籤,姑且叫它們“大標題”,用於開闢Excel工作區。
再看頁面中上部分,有不少的小標籤:
這些小標籤下屬有三種不同的情況:下拉框、文字框、暫無崗位:
Xpath分析
先看一下左邊標籤的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我就不說了啊,一個套路啦。
講一下那些個下拉框吧,這個下拉框有這麼幾種情況:
1、這是有下拉框的:/html/body/div[2]/div[2]/div[2]/div[2]/div[1]/div[2]/div/ul/a[1]
2、這是沒有下拉框但是有內容的:/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領取。
本文章素材來源於網路,如有侵權請聯絡刪除。