俺又回來嘍·(。???)ノ

在昨天的二號版本中內褲沒洗有點騷:爬蟲在手,工作休走。python+selenium爬取前程無憂(2)有一個非常尷尬的問題,那就是爬取得到的數據的後四個容易出現重複

看上面圖會發現後四個框里有好多「克隆」的數據,這是為什麼呢?(⊙_⊙)?原因我也不太清楚,可能在for循環里使用click()容易造成卡克,導致數據讀取重複吧.....可憐了我辛辛苦苦寫的代碼>﹏<,為了數據的準確,只能再想別的方法了。

不過這個錯誤的代碼我還是會保存的,以後說不定能用來當障眼法。( $ _ $ )

整理思路

1.之所以數據會重複,應該是因為網址獲取重複了,所以會導致後三個在同一頁上的數據重複,所以得先得到正確的網址

2.試試第一條是不是對的( ?? ω ?? )y

找網址其實不難,每個在class=t1里的a標籤都有,但是如何把這個從新標籤頁里打開呢

在我不懈努力(厚顏無恥)的情況下,終於在csdn上找到了一個用js語言來打開標籤的方法。

然後就簡單啦,利用lxml里的etree來解析網頁再用xpath提取,過程蛋疼了點就不上圖了。

現在奉上代碼,加了注釋,免得以後自己都忘了自己寫的啥o(* ̄▽ ̄*)o

一些配置代碼,起名為__init__放在同級目錄下
localhost="localhost"
root="root"
password="123"
database="mytest"
use="use mytest"
url="https://www.51job.com/"
Table=input("please input the table name")
INPUT= str(input("please input the profession"))
p=input("please input the place you want")
page=int(input("please input the page you want"))
drop="drop table if exists %s"%Table
create="create table %s(position varchar(255) NOT NULL,company varchar(255),workplace varchar(255),salary varchar(255),dateline varchar(255),experience varchar(255),degree varchar(255),want varchar(255),url varchar(255))"%Table
savein="insert into "+str(Table)+"(position,company,workplace,salary,dateline,experience,degree,want,url) values(%s,%s,%s,%s,%s,%s,%s,%s,%s)"

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.keys import Keys
import pymysql
import time
from lxml import html
import random
from __init__ import *
etree=html.etree
class Qcwy():
def __init__(self):
self.conn = pymysql.connect(localhost, root, password, database) #初始化,連接資料庫
self.cursor = self.conn.cursor()
self.cursor.execute(use) #選定資料庫
self.cursor.execute(drop)
sql = create
self.cursor.execute(sql) #創建表
def start(self):
self.browser=webdriver.Chrome() #啟動Chrome瀏覽器
self.browser.get(url) #獲取網址:前程無憂
self.wait=WebDriverWait(self.browser,10)
input=self.wait.until(EC.element_to_be_clickable((By.ID,"kwdselectid")))
input.send_keys(INPUT) #輸入查找的職位名
add=self.wait.until(EC.element_to_be_clickable((By.ID,"work_position_input")))
add.click()
time.sleep(1)
if self.browser.find_element_by_xpath(//*[@id="work_position_click_multiple_selected_each_120000"]/em):
cancel=self.browser.find_element_by_xpath(//*[@id="work_position_click_multiple_selected_each_120000"]/em).click()
time.sleep(1) #取消定位地點
#單個選擇方法:
place=self.browser.find_element_by_xpath(//*[@id="work_position_click_center_right_list_000000"]//*[@class="js_more"]/em[contains(text(),"%s")]%p)
place.click() #選擇地點
#多個選擇方法暫無{{{(>_<)}}}
#隨機選取5個方法:
# adds=browser.find_elements_by_xpath(//*[@data-navigation="000000"])
# slice=random.sample(adds,5)
# for s in slice:
# s.click()
ok=self.wait.until(EC.element_to_be_clickable((By.CLASS_NAME,"p_but")))
ok.click()
button=self.wait.until(EC.element_to_be_clickable((By.XPATH,"/html/body/div[3]/div/div[1]/div/button")))
button.click() #職位查找完畢,準備開始爬取
def crawl(self):
time.sleep(1)
i=0
lists = self.browser.find_elements_by_xpath(//*[@class="el"]) #得到所有列表
for list in lists :
if i<page:
current=self.browser.current_window_handle
positions=self.browser.find_elements_by_class_name(t1)
companies=self.browser.find_elements_by_class_name(t2) #分類
workplaces=self.browser.find_elements_by_class_name(t3)
salaries=self.browser.find_elements_by_class_name(t4)
datelines=self.browser.find_elements_by_class_name(t5)
urls=self.browser.find_elements_by_xpath(//*[@id="resultList"]/div/p/span/a)
for position,company,workplace,salary,dateline,url in zip(positions,companies,workplaces,salaries,datelines,urls):
p=position.text #得到每個分類的字元串
c=company.text
w=workplace.text
s=salary.text
d=dateline.text
u=url.get_attribute(href) #得到url
js=window.open("%s")%u
self.browser.execute_script(js) #打開新標籤頁,前往職位具體信息
windows = self.browser.window_handles
self.browser.switch_to.window(windows[-1]) #切換標籤頁
htmlDiv=etree.HTML(self.browser.page_source)
experience=htmlDiv.xpath("/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/text()[2]")
degree=htmlDiv.xpath("/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/text()[3]")
want=htmlDiv.xpath("/html/body/div[3]/div[2]/div[2]/div/div[1]/p[2]/text()[4]") #得到具體信息
for e,de,wa in zip(experience,degree,want):
print(p + " ", c + " ", w + " ", s + " ", d + " ", e + " ", de + " ", wa + " ", u + " ") #輸出所有信息
try:
self.cursor.execute(savein,(p,c,w,s,d,e,de,wa,u))
self.conn.commit() #存入資料庫
except:
print("error")
self.browser.switch_to.window(current)
allchung=self.browser.window_handles #關閉除主頁面的標籤頁
for handle in allchung:
if handle!=current:
self.browser.switch_to.window(handle)
self.browser.close()
self.browser.switch_to.window(current)
i=i+1
nextpage=self.wait.until(EC.element_to_be_clickable((By.LINK_TEXT,"下一頁"))) #前往下一頁
nextpage.click()
else:
self.browser.quit() #關閉瀏覽器
self.conn.close() #收工
if __name__=="__main__": #主方法
q=Qcwy()
q.start()
q.crawl()

最後做一個實站吧,還是爬在北京的Java工作,這回數據不會再錯嘍O(∩_∩)O

完成(o?v?)ノ

這樣的話這個爬蟲差不多就完工了,如果有條件的話,我會抽空加選擇多個地點爬取的方法哦。


推薦閱讀:
相关文章