本文共 3268 字,大约阅读时间需要 10 分钟。
在BOOS直聘,全面测试其页面数据获取策略。通过分析发现,其页面数据并非通过动态加载,而是采用静态链接的方式存储。因此,可以直接复制页面链接进行爬取。
##]').split('')
尽管BOOS直聘的反爬虫机制较为严格,但通过改变cookie值或使用IP代理,可以有效规避反爬限制。同时,使用本地IP代理或遵守网站规定的爬取规则(如通过/login/api获取cookies)是更合理的选择。
我@数据库设计:这是一张用于存储BOOS直聘岗位信息 database的设计。
requests
和BeautifulSoup
库抓取页面数据。job-list
下的li,进一步获取岗位详情。 3.对于每个岗位微调爬取的手法,以应对反爬虫机制的变化。import requestsfrom bs4 import BeautifulSoupimport timeimport pymysql# 爬取页数设置num = 2headers = { "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.89 Safari/537.36", "cookie": ""}def init_mysql(): dbparams = { 'host': '127.0.0.1', 'port': 3306, 'user': '数据库账号', 'password': '数据库密码', 'database': 'boos', 'charset': 'utf8mb4' } conn = pymysql.connect(**dbparams) cur = conn.cursor() return cur, conndef close(cur, conn): cur.close() conn.close()def crawing(cur, conn, response): data_list = BeautifulSoup(response.text, 'lxml') li_list = data_list.find(class_='job-list').find_all('li') for data in li_list: bs = BeautifulSoup(str(data), 'lxml') title = bs.find('a')['title'].strip() url = 'https://www.zhipin.com/' + bs.find('a')['href'] company = bs.find(class_='company-text').find(class_='name').text education = bs.find(class_='info-desc').text price = bs.find(class_='red').text page_source = requests.get(url=url, headers=headers, proxies=proxy) page_source.encoding = 'utf-8' page_bs = BeautifulSoup(str(page_source.text), 'lxml') text = page_bs.find(class_='text').text.strip() try: introduce = page_bs.find(class_='job-sec company-info').find(class_='text').text.strip() except: introduce = '无介绍' address = page_bs.find(class_='location-address').text.replace('502', '') cur.execute(sql, (title, company, price, education, text, introduce, address)) conn.commit() if num < 4: next_url = f"https://www.zhipin.com/c100010000/?query=python&page={num}&ka=page-{num}" num += 1 next_data = requests.get(url=next_url, headers=headers, proxies=proxy) next_data.encoding = 'utf-8' crawing(cur, conn, next_data) else: return cur, connif __name__ == "__main__": requests.DEFAULT_RETRIES = 5 start_url = "https://www.zhipin.com/c100010000/?query=python&page=1&ka=page-1" response = requests.get(url=start_url, headers=headers, proxies=proxy) response.encoding = 'utf-8' cur, conn = init_mysql() cur, conn = crawing(cur, conn, response) close(cur, conn)
运行暂缓,可能的原因是NoneType
对象没有find_all
方法。考虑到反爬机制,建议更换cookie或IP地址。如果仍有问题,可以采用不用代理IP的方式,或者参考方法中的小技巧进行调整。
如仍有一些特殊问题,请随时提问!我的GitHub仓库已经收录了这份源码,可star支持我,让我持续更新更多资源!
转载地址:http://vdolz.baihongyu.com/