1. 程式人生 > 實用技巧 >你要偷偷的學Python,然後驚呆所有人(第十五天)

你要偷偷的學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領取。

本文章素材來源於網路,如有侵權請聯絡刪除。