在這里,我總結了本次項目的數據收集過程中遇到的反爬蟲策略以及一些爬蟲過程中容易出現問題的地方。
user-agent
簡單的設置user-agent頭部為瀏覽器即可:
爬取標簽中帶href屬性的網頁
對于顯示崗位列表的頁面,通常檢查其源代碼就會發現,相應的標簽處存在一個a標簽,其中存在href屬性值:
于是可以選擇,爬取出該網頁中的所有的href屬性,再依次對href屬性中的所有的網址進行爬取,
current_job_links=browser.find_elements(by=By.XPATH,value='//li[@class="border-top"]//a[@target="_blank"]')
for link in current_job_links:job_path = link.get_attribute("href")job_url = urljoin(self.base_url, job_path)job_links.append(job_url)
爬取使用js跳轉的網頁,進行選型卡管理
現在好多都是不存在href,而是使用javascript進行跳轉,也就是點擊卡片之后會新開一個選項卡,因此這里要使用selenium的選項卡管理來實現browser的url變化,從而獲得新打開頁面的url(如果不切換選項卡,即使模擬單擊了卡片,也不能對打開的頁面進行爬蟲)
重點在于一定要記得切換選項卡!!
for card_element in card_elements:# 單擊卡片元素browser.execute_script("arguments[0].click();",card_element)# 等待新頁面加載完成wait.until(EC.number_of_windows_to_be(2))# 切換到新的窗口browser.switch_to.window(browser.window_handles[1])# 獲取新頁面的URLcurrent_url2 = browser.current_urlcurrent_url_list.append(current_url2)browser.close()
分頁爬取
url變化實現換頁
大部分網頁都是通過url的變化實現翻頁的:
因此只需要修改相應網址的pageNo即可,
if self.page < 100:self.page += 1# 換urlurl = 'https://zhaopin.meituan.com/web/position?hiringType=2_6&pageNo=' +str(self.page)#再次調用爬蟲yield scrapy.Request(url=url, callback=self.parse, dont_filter=True)time.sleep(3) # 設置3秒間隔
換頁url不變
使用selenium模擬瀏覽器點擊下一頁按鈕。所以需要在網頁中定位到”下一頁“按鈕的位置
next_button = browser.find_element(by=By.XPATH,value='//[@id="target_list"]/div/div[2]/div[3]/button[2]')
if not next_button.is_enabled():break
browser.execute_script("arguments[0].click();", next_button)
同時注意判斷停止條件,當按鈕不可用時表示到達最后
登錄問題
在爬取京東招聘時需要首先進行登錄
使用如下代碼實現模擬登陸: