python爬虫Pragmatic系列III

python爬虫Pragmatic系列III说明:

在上一篇博客中,我们已经学会了从赶集网上的一家公司中提取出有关的信息,并存储到Excel中。

本次目标:

在本节中,我们将批量下载赶集首页上所有的公司界面(注意不是赶集网上所有的公司页面,我们可以把这个留给之后的任务),并批量的处理所有公司的有关信息,,并保存到Excel中。

注意:

在上一篇博客中,我们使用的只是匹配赶集网上其中一家公司界面的中信息,而且不幸的是,很多的其他的公司的联系店主模块中的信息数量并不是固定的,即有的是10个li,而有的是9个li或者12个li,而且并不是所有公司都提供了QQ联系方式或者公司名称。所以,我对代码稍微做了处理,使其能够适应大部分的网页。

批量下载网页:

如下图:

我们将提取出该网页所包含的公司链接,并批量下载下来。这次,我们使用了一个下载类,利用下载类来封装我们所要的方法。我们先给定赶集网的首页链接,下载首页,接着我们分析出首页包含的公司链接并保存起来,最后我们将这些链接都下载到pagestroage文件夹中。

代码:

#-*-coding:utf-8-*-import reimport osfrom urllib import urlretrievefrom bs4 import BeautifulSoupclass Download(object):'该类将包含下载给定的url和将其保存\为相应的文件的方法'def __init__(self):self.index = 0#初始化def getPages(self,url,isMain=False):'根据给定的url进行下载,如果是赶集网主界面,则另行处理'for u in url:try:revtal = urlretrieve(u)[0]except IOError:revtal = Noneif revtal <> None and isMain == True:#是赶集网主界面self.savePages(revtal, isMain=True)elif revtal <> None and isMain <> True:self.savePages(revtal)else:print('Open url error')def savePages(self,webpage,isMain=False):'将给定的网页保存起来'f = open(webpage)lines = f.readlines()f.close()if isMain == False:#不是主界面则按序存储为filei.txt,i为序号fobj = open("pagestroage\\file%s.txt"%str(self.index), 'w')self.index += 1fobj.writelines(lines)else:#是赶集网主界面,则存储为mian.txtfobj = open("pagestroage\main.txt",'w')fobj.writelines(lines)fobj.close()def getAllComUrls(self):'我们对赶集网的主界面进行分析,提取出所有公司的链接,保存起来'if os.path.exists('pagestroage\main.txt'): #判断文件是否存在fobj = open('pagestroage\main.txt','r')lines = fobj.readlines()fobj.close()soup = BeautifulSoup(''.join(lines))body = soup.body#wrapper = soup.find(id="wrapper")leftBox = soup.find(attrs={'class':'leftBox'})list_ = leftBox.find(attrs={'class':'list'})ul = list_.find('ul')li = ul.find_all('li')href_regex = r'href="(.*?)"'urls = []for l in li:urls.append('' + re.search(href_regex,str(l)).group(1))#print urlsreturn urlselse:print('The file is missing')return Noneif __name__ == '__main__':#初试设定url为赶集网首页url=['']#实例化下载类download = Download()#先下载赶集网首页download.getPages(url,True)#对下载的赶集网首页信息进行分析,提取出所有公司的urlurls = download.getAllComUrls()#对上面提取的url进行下载download.getPages(urls)

运行结果:

我们得到了十几个包含公司网页的文本文件。如下图:

分析网页:

由上面的操作,我们已经得到了赶集网上所有公司的html文本。接着我们使用Analysiser类来处理我们得到的数据。注意,Analysiser类中的方法基本上都在前面的博客中介绍了,这里只是用类封装了,并使其能够批量处理。

代码:

#-*-coding:utf-8-*-import refrom bs4 import BeautifulSoupimport xlwtimport osimport sysreload(sys)sys.setdefaultencoding('utf-8')class Analysiser(object):'该类将分析下载的公司信息存储到Excel表格中'def __init__(self):'初始化一个Excel'self.wb = xlwt.Workbook()self.ws = self.wb.add_sheet('CompanyInfoSheet')self.initExcel()def initExcel(self):'我们初试化一个表格,并给表格一个头部,所以我们给头部不一样的字体'#初始化样式style = xlwt.XFStyle()#为样式创建字体font = xlwt.Font()font.name = 'Times New Roman'font.bold = True#为样式设置字体style.font = font# 使用样式#写入公司名称self.ws.write(0,0,u'公司名称', style)#写入服务特色self.ws.write(0,1,u'服务特色', style)#写入服务范围self.ws.write(0,2,u'服务范围', style)#写入联系人self.ws.write(0,3,u'联系人', style)#写入商家地址self.ws.write(0,4,u'商家地址', style)#写入聊天QQself.ws.write(0,5,u'QQ', style)#写入联系电话self.ws.write(0,6,u'联系电话', style)#写入网址self.ws.write(0,7,u'公司网址', style)self.wb.save('xinrui.xls')def analysAllFiles(self):'''批量分析网页源码,并提取出公司相关信息'''#得到pagestroage(我们存放下载的公司网页的文件夹)下所有的文件filenames = os.listdir('pagestroage')#得到所有存储的公司数目(去除一个包含赶集网首页的main.txt)counts = len(filenames) – 1#循环处理for i in range(counts):#打开文件,读文件到lines中,关闭文件对象f = open("pagestroage\\file%s.txt"%i, 'r')lines = f.readlines()f.close()#这两个网页的联系店主模块与其他的不一样,如果也要匹配只能重新写代码匹配,遂放弃if i == 12 or i == 7:continue#建立一个BeautifulSoup解析树,并利用这课解析树依次按照#soup–>body–>(id为wrapper的div层)–>(class属性为clearfix的div层)#–>(id为dzcontactus的div层)–>(class属性为con的div层)–>ul–>(ul下的每个li)soup = BeautifulSoup(''.join(lines))body = soup.body #body2 = soup.find('body')wrapper = soup.find(id="wrapper")clearfix = wrapper.find_all(attrs={'class':'d-left-box'})[0]dzcontactus = clearfix.find(id="dzcontactus")con = dzcontactus.find(attrs={'class':'con'})ul = con.find('ul')li = ul.find_all('li')#记录一家公司的所有信息,用字典存储,可以依靠键值对存取,也可以换成列表存储record = {}#公司名称companyName = li[1].find('h1').contents[0]record['companyName'] = companyName#服务特色serviceFeature = li[2].find('p').contents[0]record['serviceFeature'] = serviceFeature#服务提供serviceProvider = []serviceProviderResultSet = li[3].find_all('a')for service in serviceProviderResultSet:serviceProvider.append(service.contents[0])record['serviceProvider'] = serviceProvider#服务范围serviceScope = []serviceScopeResultSet = li[4].find_all('a')for scope in serviceScopeResultSet:serviceScope.append(scope.contents[0])record['serviceScope'] = serviceScope#联系人contacts = li[5].find('p').contents[0]contacts = str(contacts).strip().encode("utf-8")record['contacts'] = contacts#商家地址addressResultSet = li[6].find('p')re_h=re.compile('</?\w+[^>]*>')#HTML标签address = re_h.sub('', str(addressResultSet))record['address'] = address.encode("utf-8")restli = ''for l in range(8,len(li) – 1):restli += str(li[l])#商家QQqqNumResultSet = restliqq_regex = '(\d{5,10})'qqNum = re.search(qq_regex,qqNumResultSet).group()qqNum = qqNumrecord['qqNum'] = qqNum#联系电话phone_regex= '1[3|5|7|8|][0-9]{9}'phoneNum = re.search(phone_regex,restli).group()record['phoneNum'] = phoneNum#公司网址companySite = li[len(li) – 1].find('a').contents[0]record['companySite'] = companySiteself.writeToExcel(record,i + 1)def writeToExcel(self,record,index):'该函数将给定的record字典中所有值存储到Excel相应的index行中'#写入公司名称companyName = record['companyName']self.ws.write(index,0,companyName)#写入服务特色serviceFeature = record['serviceFeature']self.ws.write(index,1,serviceFeature)#写入服务范围serviceScope = ','.join(record['serviceScope'])self.ws.write(index,2,serviceScope)#写入联系人contacts = record['contacts']self.ws.write(index,3,contacts.decode("utf-8"))#写入商家地址address = record['address']self.ws.write(index,4,address.decode("utf-8"))#写入聊天QQqqNum = record['qqNum']self.ws.write(index,5,qqNum)#写入联系电话phoneNum = record['phoneNum']phoneNum = str(phoneNum).encode("utf-8")self.ws.write(index,6,phoneNum.decode("utf-8"))#写入网址companySite = record['companySite']self.ws.write(index,7,companySite)self.wb.save('xinrui.xls')if __name__ == '__main__':ana = Analysiser()ana.analysAllFiles()

运行结果:

我们将得到包含赶集网首页上包含的所有公司的相关信息的Excel,如下图:

觉得自己做的到和不做的到,其实只在一念之间

python爬虫Pragmatic系列III

相关文章:

你感兴趣的文章:

标签云: