def getInfo(url,proxy=''):
info={u'公司名称':'',u'所属行业':'',u'企业规模':'',u'企业性质':'',u'职位名称':'',u'工作地点':'',u'有效日期':'',u'招聘人数':'',u'职位性质':'',u'职位描述':''}
response=requests.get(url,proxies=proxy)
response.encoding='gbk'
bs=BeautifulSoup(response.text)
info[u'公司名称']=bs.find('div',{'class':'main'}).find('h1').text
temp=[]
for item in bs.find('div',{'class':'main'}).find('ul').find_all('li'):
temp.append(item.find('span').text)
info[u'所属行业']=temp[0]
info[u'企业规模']=temp[1]
info[u'企业性质']=temp[2]
info[u'职位名称']=bs.find('div',{'class':'main'}).find('h2').text
temp=[]
for item in bs.find('div',{'class':'main'}).find('div',{'class':'job_list'}).find('ul').find_all('li'):
try:
temp.append(item.find('span').text)
except:
temp.append(item.text)
info[u'工作地点']=temp[0]
info[u'有效日期']=temp[1]
info[u'招聘人数']=temp[2]
info[u'职位性质']=re.sub(u'\u804c\u4f4d\u6027\u8d28\uff1a','',temp[3])
describe=bs.find('div',{'class':'main'}).find('div',{'class':'j_i'}).text
pattern=pattern=re.compile('\t|\r\n')
describe=re.sub(pattern,'',describe)
info[u'职位描述']=describe
doc.insert_one(info)
然后第三步是保存到本地的数据库中,这里使用的是MongoDB,结合pymongo库几步就可以实现。然后ip池的代码之前也说过了,略有一些小调整如下:
#爬取代理ip
def getIp(numpage):
csvfile = file('ips.csv', 'ab')
writer = csv.writer(csvfile)
url='http://www.xicidaili.com/nn/'
user_agent='IP'
headers={'User-agent':user_agent}
for i in xrange(1,numpage+1):
real_url=url+str(i)
response=requests.get(real_url,headers=headers)
content=response.text
bs=BeautifulSoup(content)
trs=bs.find_all('tr')
for items in trs:
tds=items.find_all('td')
temp=[]
try:
temp.append(tds[1].text)
temp.append(tds[2].text)
writer.writerow(temp)
except:
pass
#从本地获取ip
def getProxy():
reader=csv.reader(open('ips.csv'))
Proxy=[]
for row in reader:
proxy={"http":row[0]+':'+row[1]}
Proxy.append(proxy)
return Proxy
#ip测试
def Test(proxy):
try:
response=requests.get('http://www.yingjiesheng.com/',proxies=proxy,timeout=2)
if response:
return proxy
except:
pass
这样的话所需要的功能都有了稍微组织一下就能实现我们最终的功能了
if __name__=='__main__':
time1=time.time()
connection=pymongo.MongoClient()
db=connection.YingJieSheng
doc=db.info
getIp(10)
print 'Have got ips , now testing'
proxy=getProxy()
pool=multiprocessing.Pool(processes=16)
IPPool=[]
temp=[]
for item in proxy:
temp.append(pool.apply_async(Test,(item,)))
pool.close()
pool.join()
for item in temp:
IPPool.append(item.get())
print 'Effective ips have been selected'
url_head='http://www.yingjiesheng.com/beijing-morejob-'
url_end='.html'
for i in xrange(1,361):
links=[]
ipproxy=IPPool[i%len(IPPool)-1]
try:
links=getLink(url_head+str(i)+url_end,ipproxy)
except:
links=getLink(url_head+str(i)+url_end)
for link in links:
try:
getInfo(link,ipproxy)
except:
try:
getInfo(link)
except:
pass
print 'Downloading the '+str(i)+' page'
time2=time.time()
print 'Total time is '+str(time2-time1)+' s'
最后运行的结果如下所示:
这样就完成了我们第一个完整的爬虫,爬取应届生网上所有职位的详细信息。当然实际操作过程中还是有一点点小问题,那就是很多爬取到ip代理不太好用,导致最后很多网页还是以本地ip去爬的,访问频率过高之后依然会导致ip被封的问题。所以如果不是很着急的话,还是在代码里加上sleep,不要对网站的访问过于密集了,以免造成服务器不必要的负担,我觉得这算是爬虫比较基本的素养吧。
最后,祝大家新年快乐~新的一年里,希望可以继续朝着自己心里的方向前进,加油!!!