本文获得的知识点:
json包的摘取,不显示页码的加载,post和get的区别;
面对反爬虫机制,多个浏览器爬取;
读取cvs文件
想找本市内一些拉勾网的大咖公司地址,思路如下:
- 找到拉勾网月薪在某个地域某个数值以上的发布信息,抽取公司
- 利用公司id找到地址
另外还有一个办法就是先找公司id,再找职位,然后进行薪酬筛选,但这样会遇到很多空值,而且拉勾网的公司id并不是按照城市分布,所以pass。
首先是用搜索找到公司,然后爬取公司ID。休假几天,手艺就不灵了,一点点东西慢慢的抠。本来想用bs4爬,拖拖拉拉的也爬不到,只好上群里问,所以然后几个大神就以光速把公司id的json包甩出来了...
泪,延迟5秒好不好.....这种速度很伤小白自尊的...
总之还是要好好学习抓包工具...
然后就是解析json文件,当然是用json.loads。至于字典里面的结构,拉勾网略复杂,不过这个也不用重新发明轮子,革命先辈们已经有无数经验了。
参考文章:
Python爬虫-爬拉勾网 by 靠谱叔
python爬虫-爬取拉钩职位-单线程 by Mr_Cxy
这里有两个地方要注意:
- 请求url的时候是post,不是get,所以把post字典的几个参数,first,pn提交。(可以在上图的headers里看到)first值为true,pn是页数。如果不提交参数,那么就只能爬到第一页。——拉勾网的网页是不显示页码加载的
def get_company_id(page):
url = 'https://www.lagou.com/jobs/positionAjax.json?*****'(根据搜索不同)
html = requests.post(url, headers=get_headers(),data = {'first':'true','pn':{page}}).content#page写入一个循环
infos1=json.loads(html)
infos=infos1['content']['positionResult']['result']#按照字典结构一层层的选下来
list_Id=[]#如果不做列表和循环,每页就只记录第一个id
for item in infos:
companyId=item['companyId']
print(companyId)
list_Id.append(companyId)
return list_Id
记得摘取字典的时候一定要加循环,就算只是试一个也要加,不要偷懒,不然会出来一堆怪东西。
- 因为拉勾网的反爬虫机制很厉害,所以很容易被ban,这里yaung大神给了我一堆浏览器,感觉可以用一百年了...然后随机选取就好了。
ua_list=[
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.1 (KHTML, like Gecko) Chrome/22.0.1207.1 Safari/537.1",
"Mozilla/5.0 (X11; CrOS i686 2268.111.0) AppleWebKit/536.11 (KHTML, like Gecko) Chrome/20.0.1132.57 Safari/536.11",
"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1092.0 Safari/536.6",
"Mozilla/5.0 (Windows NT 6.2) AppleWebKit/536.6 (KHTML, like Gecko) Chrome/20.0.1090.0 Safari/536.6",
]
def get_headers():
temp_headers = {
'Host':'www.lagou.com',
'Origin':'https://www.lagou.com'
}
user_agent = random.choice(ua_list)
temp_headers = {'User-Agent': user_agent}
return temp_headers
- 然后就是把id放入cvs,再从cvs读取。(因为这里我是分两天做的,所以做了两个py文件)
import os
os.chdir('F:')
company_list = csv.reader(open('lagou.csv', encoding='utf-8'))
for i in company_list:
print(i)
url='https://www.lagou.com/gongsi/'+str(i[0])+'.html'
开始读取的id(i)总是拼不进url,后来程工提醒,从cvs读取的数值,就算一行只有一个,也是列表格式,所以要加入索引,再转变为字符串格式。
拉勾网的结构很啰嗦,层层叠叠的,xpath也不太好取,试了几次,换成bs完成。
感觉这个功课还是挺难的,不知道是自己旅行回来变笨了,还是敌人太狡猾(拉勾网的反爬机制)。总之也算完成了,继续撒花!
下一步计划:
完成拉勾网数据分析
好好学习抓包工具charles。(一定要学了!)