工欲善其事必先利其器,准备做一个拉钩的app,但是没数据可怎么办,那就直接扒裤衩去爬吧 一般爬虫的思路为:
- 分析页面结构
- 是否有接口
- 模仿请求(解决反爬的各种方式)
- 解析数据
- 存储数据
按照以上的思路,先分析了一波拉钩网的结构,发现拉钩是直接通过接口传递数据的(这也太爽了),但是有ip访问限制,大概是1分钟请求5次的频率,所以准备一个ip代理池(土豪可以直接买一个)
接下来直接上代码了
配置信息:
client = pymongo.MongoClient(host='localhost', port=27017)
db = client['data_name']
data_collection = db['data_collection ']
headers = {"Referer": "https://www.lagou.com/jobs/list_",#必填,否则没数据"User-Agent": "Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 ""(KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36",
}
复制代码
筛选关键词:
keywords = ['java','python','前端',...#你想要的岗位或要求
]
复制代码
主要爬取流程 先使用本地ip获取->当被限制时,从代理ip池中取出ip爬取数据(该ip不可用则删除,可以使用则连续使用该ip)->将爬取的数据,进行查重并存储。
base_request = requests.post(url, data=data, headers=headers, timeout=3)
if not base_request.json().get('content', ''):flag = Falsewhile not flag: # 若代理ip没走通则换一个try:r = requests.post(url, data=data, headers=headers, timeout=3, proxies=proxies)if not r.json().get('content', ''):raise Exception('这个ip不能用')save_to_db(r.json().get('content', '')) # 存入数据库flag = True # 成功获取数据跳出循环except Exception as e:if 'HTTPSConnectionPool' in str(e):delete_proxy(proxy) # 代理本身不可用则删除该代理proxy = str(get_proxy(), encoding='utf-8')proxies = {'http': 'http://{}'.format(proxy),'https': 'http://{}'.format(proxy),} # 切换代理else:save_to_db(base_request.json().get('content', ''),'data') # 存入数据库def save_to_db(content, now_type):if now_type == 'data':data_list = contentfor item in data_list:print(item)find_data = data_collection .find_one({'companyId': item.get('companyId')})if not find_data: # 查重后插入数据库data_collection .insert(item)复制代码
详细代码戳