接触爬虫也有一段时间了,下面我就来简单介绍一种我认为较为直观有效的方式。基本搭配: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'