当前位置:   article > 正文

Python爬虫案例2:爬取前程无忧网站数据_51job 爬虫

51job 爬虫

1  爬虫技术介绍

        Python中有许多模块可以用于编写爬虫程序,常用的有urllib2requestsselenium模块等,本文选取的是selenium模块,selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,完全由JavaScript编写,因此可以用于任何支持JavaScript的浏览器上。选取其是基于以下原因:selenium模块本质是通过驱动浏览器、完全模拟浏览器的操作,配合使用随机延时操作,在保证被爬取页面完全加载以确保爬虫程序正常运行的同时,最大限度地模仿用户的行为,从而避免被网站识别为爬虫;selenium可以处理JavaScript渲染的网页,避免了其他爬虫方式如requests因为无法处理JavaScript而导致的数据缺失或错误。

2   爬虫策略

        前期解析网页和内容之后需要设计爬虫策略开始爬取数据,前程无忧网站每页显示的招聘信息量为50条,本文爬取数据时设计爬取的页面数量为200页,也就是一万条数据,为了模拟用户的行为,采用for循环遍历待爬取的每一个页面,并用程序控制在侧边滚动条上以50像素滑动一次的速度浏览页面。因目标页数较多,翻页时采用输入页码然后点击跳转的方式,避免了在for循环范围内页面突然结束的情况。

        第二大步即是对爬取的HTML文件进行解析,并将数据取出存储为excel文件,便于后续的数据预处理和可视化分析。由于爬取的数据是半结构化数据,因此要使用beautifulsoup、lxml等包对数据进行解析,本文选取的是lxml,lxml是python的一个解析库,支持HTML和XML解析,同时支持XPath(XML Path Language)解析方式。Lxml的解析速率相较BeautifulSoup更高,虽然后者学习相较更简单。

3  爬虫代码

  1. from selenium import webdriver
  2. from selenium.webdriver import ChromeOptions
  3. from time import sleep
  4. import random
  5. from selenium.webdriver.common.by import By
  6. def main():
  7. for p in range(200):
  8. p += 1
  9. print(f'爬取第{p}页')
  10. sleep(5 * random.random())
  11. for i in range(140):
  12. sleep(random.random()/5)
  13. driver.execute_script('window.scrollBy(0,50)')
  14. res = driver.page_source
  15. open(f'html/{p}.html','w',encoding='utf-8').write(res)
  16. if p != 200:
  17. driver.find_element(By.ID,'jump_page').clear()
  18. driver.find_element(By.ID,'jump_page').send_keys(p + 1)
  19. sleep(random.random())
  20. button2 = driver.find_element(By.CLASS_NAME,'jumpPage')
  21. driver.execute_script("arguments[0].click();", button2)
  22. if __name__ == '__main__':
  23. options = ChromeOptions()
  24. options.add_experimental_option('excludeSwitches', ['enable-automation'])
  25. driver = webdriver.Chrome(options=options)
  26. js = open('stealth.min.js').read()
  27. driver.execute_cdp_cmd('Page.addScriptToEvaluateOnNewDocument',{'source':js})
  28. driver.get('https://we.51job.com/pc/search?keyword=&searchType=2&sortType=0&metro=')
  29. sleep(5)
  30. input = driver.find_element(By.ID,'keywordInput')
  31. input.send_keys('电商')
  32. button1 = driver.find_element(By.ID, 'search_btn')
  33. driver.execute_script("arguments[0].click();", button1)
  34. sleep(5)
  35. main()
  36. driver.quit()

4  爬虫解析代码

  1. from lxml import etree
  2. import pandas as pd
  3. def collect():
  4. resls = []
  5. for i in range(200):
  6. i += 1
  7. res = open(f'html/{i}.html',encoding='utf-8').read()
  8. tree = etree.HTML(res)
  9. for li in tree.xpath('.//div[@class="j_joblist"]/div'):
  10. name = li.xpath('.//span[@class="jname at"]/text()')[0]
  11. href = li.xpath('./a/@href')[0]
  12. time = li.xpath('.//span[@class="time"]/text()')[0]
  13. sala = (li.xpath('.//span[@class="sal"]/text()') + [''])[0]
  14. addr = (li.xpath('.//span[@class="d at"]/span/text()') + [''] * 5)[0]
  15. exp = (li.xpath('.//span[@class="d at"]/span/text()') + [''] * 5)[2]
  16. edu = (li.xpath('.//span[@class="d at"]/span/text()') + [''] * 5)[4]
  17. comp = li.xpath('.//a[@class="cname at"]/text()')[0]
  18. kind = li.xpath('.//p[@class="dc at"]/text()')[0].split('|')[0].strip()
  19. num = (li.xpath('.//p[@class="dc at"]/text()')[0].split('|') + [''])[1].strip()
  20. ind = (li.xpath('.//p[@class="int at"]/text()') + [''])[0]
  21. dic = {
  22. '职位': name,
  23. '链接': href,
  24. '时间': time,
  25. '薪资': sala,
  26. '地区': addr,
  27. '经验': exp,
  28. '学历': edu,
  29. '公司': comp,
  30. '类型': kind,
  31. '规模': num,
  32. '行业': ind
  33. }
  34. print(dic)
  35. resls.append(dic)
  36. pd.DataFrame(resls).to_excel('前程无忧电商数据.xlsx', index=False, encoding='utf-8')
  37. if __name__ == '__main__':
  38. collect()

5  数据采集结果

        爬取数据的部分截图如图所示,数据包含职位名称、链接、发布时间、薪资、地区、经验要求、学历要求、公司名称、类型、规模、所属行业11个字段。

        相关代码文件和爬取的前程无忧网页数据excel文件(共计1万条数据)已上传至资源,需要者自取即可。

        ps:各种网站为了反爬虫会时常更新网页代码,同一个网页可能不到一个月爬虫代码就爬不了了,所以大家最重要的是学习爬虫技术,一边根据网页自己调整代码。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/知新_RL/article/detail/696068
推荐阅读
相关标签
  

闽ICP备14008679号