伯乐身高爬虫

最近在朋友的博客里看到了一篇文章,是讲伯乐在线这个网站上有一个面向对象栏目。什么是面向对象呢,面向对象是一个专门为IT单身男女服务的征友传播平台,由伯乐在线专门为程序员爱情创立的一个公益+免费活动。简单来说,网站的女用户在这个栏目组发帖子,包括自己的相关信息,以及理想的男友条件,男生们可以付出一定代价获得女用户保存在网站上的个人联系方式,看对眼的话,就去领证:)

然后呢,我这个朋友关注的点不太主流,他不用爬虫爬妹子照片,或者通过黑客攻击拿到妹子的联系方式,反而用python将所有发表的帖子当中对身高的要求给爬了..>

下面是我将他的代码改进:

import requests
import re
import os
import sys

import time
from bs4 import BeautifulSoup

pageNum = 10  # 所有帖子总共10页
urlsFile = os.path.join(sys.path[0],'urls.txt')
# 保存帖子url的本地路径的字符串,os.path.join()知识提供文件路径拼接功能 如果想要创建文件夹 则使用os.mkdir(path)
infoNum = 0 #有效信息的总条数
num = 0   #包含敏感信息的总条数

# 获取所有帖子的url
def getUrls():
    if(os.path.exists(urlsFile)):
        return getUrlsFromFile()#如果本地存在数据直接从本地读取
    urlList = list()
    url='http://date.jobbole.com/page/1/?sort=latest'
    while url:
        html = requests.get(url)
        pattern = "href=\"(.*?)\">.*?</a><label class=\"hide-on-480 small-domain-url\"></label>"
        result = re.findall(pattern,html.text)
        urlList = urlList + result
        tem=(re.findall('<li id=\"pagination-next-page\"><a href=\"(.*?)\"',html.text))
        if len(tem)>0:url=tem[0]
        else:url=None
    saveUrls(urlList) #保存到本地
    return urlList

#本地读取所有帖子的url
def getUrlsFromFile():
    urlList = list()
    f = open(urlsFile,"r")
    for line in f.readlines():
        #全部读取再按行打乱 则每行是带换行符的数据,使用时 strip过滤
        urlList.append(line.strip())
    f.close()
    return urlList

#将帖子信息存入本地文件中
def saveUrls(urlList):
    f = open(urlsFile,"w")
    f.write('%s' % '\n'.join(urlList))

#查询该帖子下的内容
def viewUrl(url):
    global infoNum
    result = ""
    html = requests.get(url)
    soup = BeautifulSoup(html.text,"lxml")
    info = soup.find("div",{"class":"p-entry"})
    info = str(info)
    pattern = "对另一半的最低要求是:(.*?)<br/>"
    r = re.findall(pattern,info)
    if len(r)>0:#保证不会抛出异常
        if (r[0]!=""):
            infoNum  = infoNum+ 1
            result = r[0]
            isAboutH(result)

#是否有涉及身高的敏感信息
def isAboutH(info):
    global num
    print(info)
    keys=['(\d{3})','(\d\.\d\d)','(\d\.\d)']
    f = open("infoH.txt","a")
    for p in keys:
        r = re.findall(p,info)
        if(len(r)):
            num = num + 1
            f.write(str(r[0])+"\n")
            f.close()
            print(r[0])
            break
    f.close()
    print("\n")

#读取在文件中的身高数据求平均值
def getAvarge():
    numList=list()
    f = open("infoH.txt","r")
    for line in f.readlines():
        line=line.strip()
        if line!='':
            #去除小数点
            if line.find('.')!=-1:
                line=(float(line))*100
            num = float(line)
            numList.append(num)
    result=0.0
    for num in numList:
        result+=num
    return result/len(numList)

urlList = getUrls()
num = 0
#每次爬去时需将上次爬虫信息清空
f = open("infoH.txt","w")
f.close()
for i in range(0,len(urlList)):
    print('第'+str(i+1)+'个begin:')
    viewUrl(urlList[i])
    print('进度 %.2f\n' % ((i+1)/len(urlList)))
    time.sleep(0.1)
print(infoNum)
print(num)

print('平均身高 %.2f' % getAvarge())

这个小玩具呢,实际上很简单,通常我在解析网页信息的时候有两种简单粗暴地选择,

  1. BeautifulSoup解析

  2. 正则表达式

由于我也没有通过具体的数值计算了解这两种方式的效率,所以我就顺意优先使用BeautifulSoup,如果一个信息通过一次简单的BS解析无法完成时,在这里我就使用Re正则表达式。

通过爬虫信息可以看出,妹子们的要求实际上没有太高,(当然可能是怕吓跑太多人555~),有150+的有效数据,而明确要求最低身高的大概80名左右,经过计算平均值在172左右,嗯,好吧,就这样。

posted @ 2016-03-01 11:27  窗外临街  阅读(225)  评论(0编辑  收藏  举报