标题无心冒犯,就是以为这个广告挺好玩的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领取。
本文章素材来源于网络,若有侵权请联系删除。