原文链接

前言

来到BOOS直聘
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图1
搜索python
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图2
打开控制台,查看请求发现,页面数据不是动态加载
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图3
所以直接复制当前页面链接进行爬取,经过多次的爬取之后
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图4
。。。。。。。
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图5
失策失策,以前爬取别的网站从没有这么严格的反爬虫机制,没到到翻车了。。
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图6

偷偷告诉大家一个小技巧:虽然被禁止访问了,但登录后就又可以访问了,嘿嘿!可惜我当时不知道,事后才发现,可惜。
现在这样只能使用IP代理了
使用 IP代理 参考以下文章
Python爬虫避坑IP代理教程避坑(reuqests和selenium的ip代理)
建立boos数据库
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图7
boos建表语句

  1. CREATE TABLE `boos` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `title` varchar(100) DEFAULT NULL,
  4. `company` varchar(100) DEFAULT NULL,
  5. `price` varchar(100) DEFAULT NULL,
  6. `education` varchar(100) DEFAULT NULL,
  7. `text` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
  8. `introduce` text CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci,
  9. `address` varchar(100) DEFAULT NULL,
  10. PRIMARY KEY (`id`)
  11. ) ENGINE=InnoDB AUTO_INCREMENT=99 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;

完整代码及注释分析

  1. import requests
  2. from bs4 import BeautifulSoup
  3. import time
  4. import pymysql
  5. #控制爬取页数
  6. num = 2
  7. #插入语句
  8. sql = "insert into boos(id,title, company, price, education, text, introduce ,address) values(null,%s,%s,%s,%s,%s,%s,%s)"
  9. #请求头
  10. headers = {
  11. "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",
  12. #爬取boos直聘cookie必不可少,参考图1
  13. "cookie": "_uab_collina=159575841104312945170807; __zp__pub__=; __c=1595890401; lastCity=100010000; JSESSIONID=""; _bl_uid=vLkaCdRI5j77gqrsIh0gbF4mC44z; sid=sem_pz_bdpc_dasou_title; __g=sem_pz_bdpc_dasou_title; __l=l=%2Fwww.zhipin.com%2F&r=https%3A%2F%2Fwww.google.com%2F&friend_source=0&g=%2Fwww.zhipin.com%2F%3Fsid%3Dsem_pz_bdpc_dasou_title&friend_source=0; Hm_lvt_194df3105ad7148dcf2b98a91b5e727a=1595893052,1595903578,1595903959,1595906815; t=EPTZCBdCrM30pa4h; wt=EPTZCBdCrM30pa4h; Hm_lpvt_194df3105ad7148dcf2b98a91b5e727a=1595913530; __a=50500966.1595758411.1595862833.1595890401.177.4.124.36; __zp_stoken__=67beaGmFLZg0RXnJQY3cBIzMicU9jYzIZF1VdYXwsKBQkPCwGb0tdGEcsOHITTCwFWi49AjoIYy5BJTgsdSFCBVEoc1kTdgEWRSMQRTg3IBNgSQ5DPHsvDSFNcwokCHtOGBd4fT93SAUJYTk%3D"
  14. }
  15. #IP代理
  16. proxy = {
  17. 'https': '61.178.118.86:8080'
  18. }
  19. #爬取数据
  20. def Crawling(cur,conn,response):
  21. #引入全局变量
  22. global num
  23. global sql
  24. # 使用lxml XML解析器
  25. data_list = BeautifulSoup(response.text, "lxml")
  26. #拿到所有的li标签然后遍历,参考图2
  27. #由于li没有class什么的,我们找到搜索li的父标签定位,再找下面的所有li
  28. li_list = data_list.find(class_="job-list").find_all("li")
  29. #遍历
  30. for data in li_list:
  31. bs = BeautifulSoup(str(data), "lxml")
  32. #职位,参考图3
  33. title = bs.find("a")["title"].strip()
  34. url = "https://www.zhipin.com/" + bs.find("a")['href']
  35. # 公司,图4
  36. company = bs.find(class_="company-text").find(class_="name").text
  37. # 公司福利 5
  38. education = bs.find(class_="info-desc").text
  39. # 薪资 6
  40. price = bs.find(class_="red").text
  41. # print(title+"--"+company+"--"+price+"--"+education)
  42. # # 请求详情页,进行数据爬取
  43. time.sleep(1)
  44. page_source = requests.get(url=url, headers=headers)
  45. page_source.encoding = "utf-8"
  46. page_bs = BeautifulSoup(str(page_source.text), "lxml")
  47. # 岗位职责,图7
  48. text = page_bs.find(class_="text").text.strip()
  49. #print(text)
  50. #print("+"*100)
  51. # 公司介绍,参考图8
  52. #有的公司没有介绍,爬取的时候会异常,我们呢处理异常,没有的时候直接给无介绍
  53. try:
  54. #因为这里的class值也是text,由于find的特性只会返回匹配到的第一个值,所以我们选择定位他的父标签,再找它
  55. introduce = page_bs.find(class_="job-sec company-info").find(class_="text").text.strip()
  56. except:
  57. introduce = "无介绍"
  58. # 工作地址,图9
  59. #有的公司地址后带有502,我们把它替换成空串
  60. address = page_bs.find(class_="location-address").text.replace("502","")
  61. #执行sql,提交事务
  62. cur.execute(sql, (title, company, price, education, text, introduce, address))
  63. conn.commit()
  64. #多页爬取
  65. if num < 4:
  66. #链接分析,图10
  67. next_url = "https://www.zhipin.com/c100010000/?query=python&page="+str(num)+"&ka=page-"+str(num)
  68. num += 1
  69. next_data = requests.get(url=next_url,headers=headers,proxies=proxy)
  70. next_data.encoding = "utf-8"
  71. #爬取
  72. Crawling(cur,conn,next_data)
  73. else:
  74. return cur,conn
  75. #初始化mysql连接
  76. def init_mysql():
  77. dbparams = {
  78. 'host': '127.0.0.1',
  79. 'port': 3306,
  80. 'user': '数据库账号',
  81. 'password': '数据库密码',
  82. 'database': 'boos', #数据库名
  83. 'charset': 'utf8'
  84. }
  85. conn = pymysql.connect(**dbparams)
  86. cur = conn.cursor()
  87. return cur,conn
  88. #关闭数据库连接
  89. def close(cur,conn):
  90. cur.close()
  91. conn.close()
  92. #起始
  93. if __name__ == "__main__":
  94. #print("="*40)
  95. #防止请求频繁,关闭多余链接,可参考博主的文章
  96. requests.DEFAULT_RETRIES = 5
  97. s = requests.session()
  98. s.keep_alive = False
  99. #请求链接,只需更改url即可爬取自己想爬取的数据
  100. start_url = "https://www.zhipin.com/c100010000/?query=python&page=1&ka=page-1"
  101. response = requests.get(url=start_url, headers=headers,proxies=proxy)
  102. time.sleep(2)
  103. response.encoding = "utf-8"
  104. # print("="*40)
  105. #查看请求状态码,200为成功
  106. print(response.status_code)
  107. cur,conn = init_mysql()
  108. #爬取数据
  109. cur,conn = Crawling(cur,conn,response)
  110. #关闭数据库连接
  111. close(cur,conn)

图片辅助分析

图1
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图8
图2
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图9
图3
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图10
图4
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图11
图5
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图12
图6
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图13
图7
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图14
图8
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图15
图9
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图16
图10
Python爬虫实战:2020最新BOOS直聘爬取教程 - 图17

运行结果

Python爬虫实战:2020最新BOOS直聘爬取教程 - 图18

  1. 'NoneType' object has no attribute 'find_all'

BOOS直聘的反爬虫机制确实厉害,如果报以上错误,可以通过更换cookie或者更换代理IP来解决
实在不行,那就用不用代理ip了,还是用本机的,小技巧在上面已经教给大家了。
觉得博主写的不错的读者大大们,可以点赞关注和收藏哦,谢谢各位!

博主更多博客文章