#encoding=utf-8 模块导入 import requests from lxml import etree import xlwt import urllib.request
主程序
def main(): baseurl = 'https://www.douban.com/group/beijingzufang/discussion?start={0}' #URL地址,{}中间数字可以跟随for循环一直更改 datalists=getdata(baseurl) savedata(datalists)
网页解析
def getdata(baseurl): #爬取网页 datalist = [] #新建空列表,方便存储爬取到的数据 for i in range(0,226,25): #豆瓣每一次翻页,数字增加25,故步长设置为25,左闭右开,226结束 url = baseurl.format(i)#生成每一页的url headers={ 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.25 Safari/537.36 Core/1.70.3870.400 QQBrowser/10.8.4405.400', }#设置请求头 resp=requests.get(url=url,proxies={'https':'IP'},headers=headers,)#访问网页,多次访问豆瓣会屏蔽,因此需要换IP html=resp.content.decode('utf-8') #设置网页解码格式 tree=etree.HTML(html)#根据xpath的规则解析网页 names=tree.xpath('//td[@]/a/text()') #//表示全局搜索,页面的属性刚好是我们需要的,用text()获取到下面具体的文本信息。 hrefs = tree.xpath('//td[@]/a/@href')#用@属性名获取属性值 users= tree.xpath('//td[@nowrap="nowrap"]/a/text()') # 如果print(names)#生成的是一个大列表,含25个names for x in zip(names,users,hrefs): #将每一次获取到的标题名和链接,用户名合并成为元组 x=list(x) #将元组转化成列表 filters=['136964886X7','热心吃瓜群众','1398319X6978','M.','18315277X59','于','1762X9668','紫幕','15223X4445','墨尘若雪', '18502X5129','。','1911165X949','1512X0681','16602X860','嘛嘛公寓','18716X0847','招财喵','1327X85500','你是来拉屎的吧','1X22301207', '真的 ','157614X040','丁丁猫儿' ,'盯盯猫儿','清','李三岁','150x337327','不要芝麻','X女生租房','133X39801']#设置中介过滤容器,对列表进行检查,如果有信息在容器里面,则不加入列表 if any(keyword in x for keyword in filters):continue #遍历容器,如果容器的信息不在X列表里面,则继续向下执行 datalist.append(x) #把X添加到datalist列表 print('爬取第%d页完毕'%i) return datalist #返回内容到主程序,进行下一个程序的执行
数据保存到EXCEL
def savedata(datalists):#保存数据 workbook=xlwt.Workbook(encoding='utf-8') #新建表格 worksheet=workbook.add_sheet('目录') #新建sheet col=('标题','用户','链接') #第一行标题栏名称 for i in range(len(col)): #len()是根据标题的长度来判断需要的列数 worksheet.write(0,i,col[i])#该处第三个参数运用到的是访问元组的方式,横向填写好标题栏名称 for i in range(0,len(datalists)): # print('第%d条'%i) data = datalists[i]#遍历外部传入的列表,依次将每一个数据赋值给data, for j in range(0,len(col)):#控制列数 worksheet.write(i+1,j,data[j].strip())#第一行是标题栏,因此从第二行开始,第二个是列数保持参数不变,第三个参数根据列数,获取到data当中的的0,1,2的值,并将信息填入表格。.strip是去掉空白,规范格式 workbook.save('12月8日2.xlsx') #保存表格 print('输出完毕')
程序启动
if __name__ == '__main__': main()
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)