简单的介绍
众所周知,领英的反爬做的是真不绰,所以在爬取过程中共采取过两个方法。第一个是想借助百度快照,百度会每隔一段时间在全网进行爬取,所以猜想可以从百度这个中间商那里得到数据。第二个方法是“硬爬”。顾名思义,就是在登陆账号的状态下一个个爬取,详情会在下文提到。
已有资料
在爬取之前,手头已有要爬取的员工所在企业名单,文件类型是xlsx.。还需要领英账号(多个),如果出现要提交身份证信息的时候建议换个账号。
百度快照爬取
这个方法是一开始想做的,在效果上其实比较一般。因为有两个问题:一是百度快照仅能爬取域名为cn. 开头的领英页面,但是有很多大型企业或者外企的员工的领英页面为hk. 等非内地域名,是无法通过快照获得的。二是被百度快照爬下的领英数据本身就不完整,会有较多遗漏。尽管如此,我还是将方法和代码写在这里,供有需要的使用和改进。
第一步
虽然载体是百度快照,但是写爬虫还是比较推荐一段代码做一件事,因为在过程中会有奇奇怪怪的突发状况发生,一口气吃成一个胖子会debug de上天。所以第一步做的事情就是先将公司名字输入百度,然后从搜索结果中爬取需要的网址并保存。
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import MoveTargetOutOfBoundsException
from selenium.webdriver.chrome.options import Options
import time
from xlutils.copy import copy
import pandas as pd
def click_by_time(driver,xpath,maxTime):#防止动态元素未加载出来,无法点击导致程序出错,故定义该方法,等元素加载出来再点击它
t = 0
while t<=maxTime:
if driver.find_element_by_xpath(xpath)!=None:
driver.find_element_by_xpath(xpath).click()
break
time.sleep(1)
t+=1
#此处为企业名单
xlsx = pd.ExcelFile(r'C:\Users\12610\领英\汽车整车制造企业名单.xlsx')
data = pd.read_excel(xlsx,'Sheet1')
for indexs in data.index:
print(indexs)
key = str(data.loc[indexs].values)[2:-2] + ' 领英 site:cn.linkedin.com'
#[2:-2]的处理是由于字符串又引号
chrome_options = Options()
chrome_driver = r"C:\Users\12610\AppData\Local\Google\Chrome\Application\chromedriver.exe"
#这里换成自己的路径
driver = webdriver.Chrome(chrome_driver,options=chrome_options)
driver.get('https://www.baidu.com/')
#定位搜索框,输入企业名并点击百度一下
searchingBox = driver.find_element_by_xpath('//*[@id="kw"]')
searchingBox.send_keys(key)
click_by_time(driver,'//*[@id="su"]',10)
time.sleep(2)
#有用的搜索结果中有'| 领英',这步算是筛选
pattern = '| 领英'
titles = driver.find_elements_by_class_name('c-container')#所有搜索结果节点class均为'c-container'
#进一步定位到网址,网址中有cache即为快照页面,是我们目前需要的
from selenium import webdriver
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import TimeoutException
from selenium.common.exceptions import MoveTargetOutOfBoundsException
from selenium.webdriver.chrome.options import Options
import time
from xlutils.copy import copy
import pandas as pd
def click_by_time(driver,xpath,maxTime):#防止动态元素未加载出来,无法点击导致程序出错,故定义该方法,等元素加载出来再点击它
t = 0
while t<=maxTime:
if driver.find_element_by_xpath(xpath)!=None:
driver.find_element_by_xpath(xpath).click()
break
time.sleep(1)
t+=1
xlsx = pd.ExcelFile(r'C:\Users\12610\领英\汽车整车制造企业名单_refined.xlsx')
data = pd.read_excel(xlsx,'Sheet1')
for indexs in range(5):
print(indexs)
key = str(data.loc[indexs].values)[2:-2] + ' site:linkedin.com'
chrome_driver = r"C:\Users\12610\AppData\Local\Google\Chrome\Application\chromedriver.exe"
chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(chrome_driver,options=chrome_options)
driver.get('https://www.baidu.com/')
#定位搜索框
searchingBox