python+selenium+scrapy搭建簡單爬蟲
阿新 • • 發佈:2019-01-06
接觸爬蟲也有一段時間了,下面我就來簡單介紹一種我認為較為直觀有效的方式。基本搭配:python2.7+selenium+scrapy,selenium用來模擬真實使用者操作瀏覽器的過程,scrapy用來提取網頁內容。
關於安裝方式我就暫且提一下我接觸過的兩種:
1.安裝python2.7,使用pip install+包名的形式安裝selenium和scrapy。一般這種情況下裝scrapy都比較痛苦。如果直接使用命令列無法安裝成功,那麼可以去官網上下載對應的包直接執行。
2.安裝Anaconda,使用pip install+包名或者conda install+包名的形式安裝selenium和scrapy。
爬取的過程概括一下就是首先定義一個瀏覽器物件,然後使用這個物件實現諸如滑鼠點選,鍵盤傳送等一系列的操作。對於想要提取內容的頁面,就使用scrapy中的Selector構造xpath去解析網頁原始碼。
這麼講可能太抽象,所以我把一個比較簡單的爬取指定企業招聘資訊的程式貼出來具體講解。實現基本操作的程式碼上方均有註釋。
#coding:utf-8
import sys
reload(sys)
sys.setdefaultencoding( "utf-8" )
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.action_chains import ActionChains
from scrapy.selector import Selector
import time
import os
def writeFile(dirPath, page):
data = Selector(text = page).xpath("//td[@class='zwmc']/div/a")
titles = data.xpath('string(.)').extract()
timeMarks = Selector(text = browser.page_source).xpath("//td[@class='gxsj']/span/text()" ).extract()
links = Selector(text = browser.page_source).xpath("//td[@class='zwmc']/div/a/@href").extract()
for i in range(len(titles)):
fileName = titles[i].replace(':', '-').replace('/', '-').replace('\\', '-').replace('*', 'x').replace('|', '-').replace('?', '-').replace('<', '-').replace('>', '-').replace('"', '-').replace('\n', '-').replace('\t', '-')
filePath = dirPath + os.sep + fileName + '.txt'
with open(filePath, 'w') as fp:
fp.write(titles[i])
fp.write('$***$')
fp.write(timeMarks[i])
fp.write('$***$')
fp.write(links[i])
def searchFunction(browser, url, keyWord, dirPath):
browser.get(url)
#勾選城市
browser.find_element_by_xpath("//input[@id='buttonSelCity']").click()
browser.find_element_by_xpath("//table[@class='sPopupTabC']/tbody/tr[1]/td/label/input[@iname='北京']").click()
browser.find_element_by_xpath("//table[@class='sPopupTabC']/tbody/tr[1]/td/label/input[@iname='上海']").click()
browser.find_element_by_xpath("//table[@class='sPopupTabC']/tbody/tr[3]/td/label/input[@iname='南京']").click()
browser.find_element_by_xpath("//table[@class='sPopupTabC']/tbody/tr[4]/td/label/input[@iname='蘇州']").click()
browser.find_element_by_xpath("//table[@class='sPopupTabC']/tbody/tr[4]/td/label/input[@iname='無錫']").click()
browser.find_element_by_xpath("//div[@class='sPopupTitle250']/div/a[1]").click()
#定位搜尋框
searchBox = browser.find_element_by_xpath("//div[@class='keyword']/input[@type='text']")
#傳送搜尋內容
searchBox.send_keys(keyWord)
#確認搜尋
browser.find_element_by_xpath("//div[@class='btn']/button[@class='doSearch']").click()
totalCount = Selector(text = browser.page_source).xpath("//span[@class='search_yx_tj']/em/text()").extract()[0]
pageOver = int(totalCount) / 40
for i in range(pageOver):
time.sleep(3)
writeFile(dirPath, browser.page_source)
browser.find_element_by_link_text("下一頁").click()
time.sleep(3)
writeFile(dirPath, browser.page_source)
if __name__ == '__main__':
print 'START'
url = 'http://www.zhaopin.com/'
keyWord = u"華為技術有限公司"
dirPath = keyWord + u"招聘資訊"
if not os.path.exists(dirPath):
os.makedirs(dirPath)
#定義一個火狐瀏覽器物件
browser = webdriver.Firefox()
searchFunction(browser, url, keyWord, dirPath)
browser.close()
print 'END'