数据分析之拉勾网(三)
拉勾网,这里用谷歌是打不开的,只能换其他浏览器,同样和第一篇步骤一样,也是找动态接口
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传
这里需要注意的是cookie,因为这里每个cookie都是不一样的,所以我们需要先获取它们的cookie,然后才能构建我们的headers,这样才能获取我们需要的信息,通过返回值把每个网页的cookie传到我们的自己搭建的headers里面,这样就可以获取到数据了
def get_cookie():
url = 'https://www.lagou.com/jobs/list_{}?labelWords=&fromSearch=true&suginput='.format(keyword)
# 注意如果url中有中文,需要把中文字符编码后才可以正常运行
headers = {
'User-Agent': 'ozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400'
}
response = requests.get(url=url,headers=headers,allow_redirects=False)
return response.cookies
然后就是构建我们的headers和data了,需要改的是data里面的kd而已,kd就是我们的关键词,sid是用md5加密的一个随机数,这里很好破解用我们的hashlib库就好了
headers = {
'Host': 'www.lagou.com',
'Origin': 'https://www.lagou.com',
'referer': 'https://www.lagou.com/jobs/list_{}?labelWords=&fromSearch=true&suginput='.format(keyword),
'User-Agent': 'ozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3704.400 QQBrowser/10.4.3587.400'
}
data = {
'first': 'false',
'pn':int(i),
'kd': '景区讲解员',
'sid':str(random_id),
}
md5 = hashlib.md5()
id = str(random.random())
md5.update(id.encode('utf-8'))
random_id = md5.hexdigest()
然后获取相关信息也是用正则表达式就好了
# 招聘企业名称
company_names = re.compile('"companyFullName":"(.*?)",', re.S | re.I)
company_name = company_names.findall(content)
# 招聘企业规模
companysize_texts = re.compile('"companySize":"(.*?)",', re.S | re.I)
companysize_text = companysize_texts.findall(content)
# 招聘企业性质
companytype_texts = re.compile('"financeStage":"(.*?)",', re.S | re.I)
companytype_text = companytype_texts.findall(content)
# 招聘工作地区
workarea_texts = re.compile('"city":"(.*?)",', re.S | re.I)
workarea_text = workarea_texts.findall(content)
# 招聘职位名称
job_names = re.compile('"positionName":"(.*?)",', re.S | re.I)
job_name = job_names.findall(content)
# 招聘岗位薪资
providesalary_texts = re.compile('"salary":"(.*?)",', re.S | re.I)
providesalary_text = providesalary_texts.findall(content)
job_hrefs = re.compile('"positionId":(.*?),"', re.S | re.I)
job_href = job_hrefs.findall(content)
然后当我们想要进去详细页面的时候,却发现,获取不了数据,这个原因也是因为拉勾的反爬虫机制,我们需要加一个params,这个params和上面的sid其实都是一个数,都是用Md5加密获得的,上面我们已经把它的md5给破解了,所以直接照着用就好了
params = {
'show':str(random_id),
}
然后当我们进去的时候发现每个页面的链接是这样的
https://www.lagou.com/jobs/7553194.html?show=dd979620732248e0b4959dd25dd4b608
7553194这个数字我们可以通过上面的动态接口获得,后面show每个都是变化的,细心点发现,其实还是和上面的md5是一个东西来的,因为上面已经写好md5的解密了,所以还是直接拿来用就好了
for j in job_href:
href = "https://www.lagou.com/jobs/{}.html?show={}".format(j,str(random_id))
html = requests.get(href, headers=headers, params=params, cookies=get_cookie())
context = html.text
soup = etree.HTML(context)
job_describe = soup.xpath('//div[@class= "job-detail"]/p/text()')
j_d = soup.xpath('//div[@class= "job-detail"]/text()')
job_name = soup.xpath('//h1[@class = "name"]/text()')
Jobname.append(job_name)
JobDescribe.append(job_describe)
jobdescribe.append(j_d)
df = pd.DataFrame()
df["企业名称"] = company_name
df["企业规模"] = companysize_text
df["企业性质"] = companytype_text
df["工作地区"] = workarea_text
df["职位名称"] = Jobname
df["岗位薪资"] = providesalary_text
df["岗位描述"] = JobDescribe
df["岗位介绍"] = jobdescribe
try:
df.to_csv("拉勾网.csv", mode="a+", header=None, index=None, encoding="gbk")
print("写入成功")
except:
print("当页数据写入失败")
time.sleep(1)
这里就是全部思路了,代码的话,可以去我的GitHub账户上面把源代码下载下来,如果对你有帮助的话,不嫌麻烦,可以在我的GitHub点一下start,你的支持是我更新的动力
time.sleep(1)
这里就是全部思路了,代码的话,可以去我的GitHub账户上面把源代码下载下来,如果对你有帮助的话,不嫌麻烦,可以在我的GitHub点一下start,你的支持是我更新的动力
[拉勾网源代码](https://github.com/13060923171/Crawl-Project2/tree/master/%E7%88%AC%E5%8F%96%E6%8B%89%E5%8B%BE%E7%BD%91%E6%8B%9B%E8%81%98%E4%BF%A1%E6%81%AF)
[数据分析之前程无忧(一)](https://blog.csdn.net/zyh960/article/details/108084173)
[数据分析之大街网(二)](https://blog.csdn.net/zyh960/article/details/108084272)
[数据分析之拉勾网(三)](https://editor.csdn.net/md/?articleId=108084318)
[数据分析之数据清洗(四)](https://blog.csdn.net/zyh960/article/details/108084347)