1. 程式人生 > >使用Python對雙色球號碼進行爬取

使用Python對雙色球號碼進行爬取

使用Python福彩官網對雙色球進行爬取

很久之前寫的一個小爬蟲,程式碼其實有點冗雜,看官姥爺們如果有什麼可以指點的地方,儘量拍,謝謝~

一點一點加油吧

觀察一下除了第一頁之外其他頁面的索引可以用index_+num來實現
得出程式碼:

def get_link(pages = 10):   #定義頁面的生成器
    for i in xrange(pages):
        url = 'http://www.cwl.gov.cn/kjxx/ssq/hmhz/'
        if i == 0:
            url = url + 'index.shtml'
        else:
            url = url + 'index_' + str(i) + '.shtml'
        yield url

取出頁面:

for url in get_link(page):
    ul = url

測試效果:(列印預設狀況)

接下來使用firebug對頁面進行分析:
審查元素找到所需爬取資訊

對元素資訊進行定位:
這裡使用的是re對頁面元素進行定位:

cmpdate = re.compile('<td height="35">(\d+?)</td>') #日期
cmpblue = re.compile('<span class="blue">(\d\d)')  #藍球
cmpred = re.compile('<span>(\d\d)</span>')  #紅球

後來看一下這樣的寫法比較基礎雖然可以提取資料但是後處理似乎比較麻煩
整合一下

def getlottery(pages = 10):
    hd = {'user-agent' : 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.81 Safari/537.36'}
    date = []
    redball = []
    blueball = []
    cmpdate = re.compile('<td height="35">(\d+?)</td>')
    cmpblue = re.compile('<span class="blue">(\d\d)')
    cmpred = re.compile('<span>(\d\d)</span>')
    for url in get_link(pages):
        try:
            html = requests.get(url, headers = hd)
            html.raise_for_status()
            html.encoding = html.apparent_encoding
            res = html.text
        except:
            pass
        D = re.findall(cmpdate, res)
        B = re.findall(cmpblue, res)
        R = re.findall(cmpred, res)
        date.append(D)
        blueball.append(B)
        redball.append(R)
        return date, redball, blueball

測試執行:

爬取第一頁的資訊

對比一下頁面的資訊

算是成功了

不過看著第二個雜亂的列表,還是想說,後處理真的好麻煩QAQ

後續工作,可能還是需要想一下怎麼樣去寫一個好的正則表示式才能讓輸出列表的可讀性更強吧

補:(後處理)qwq:

def washdata(date, redball, blueball):
    tmp = []
    D = []
    B = []
    R = []
    for i in xrange(len(date)):
        for j in xrange(len(date[i])):
            D.append(date[i][j])
            B.append(blueball[i][j])
        for j in xrange(len(redball[i])):
            tmp.append(redball[i][j])
    m = 0
    while m != len(tmp):
        R.append(tmp[m:m+6])
        m += 6
    return D, R, B

def writefile(date, redball, blueball):
    with open('Lottery.csv', 'wb') as csvFile:
        writer = csv.writer(csvFile)
        fileheader = ['Date', 'RedBall#0', 'RedBall#1', 'RedBall#2', 'RedBall#3', \
                        'RedBall#4', 'RedBall#5','BlueBall']
        writer.writerow(fileheader)
        for i in xrange(len(date)):
            writer.writerow([date[i], redball[i][0], redball[i][1], \
             redball[i][2], redball[i][3], redball[i][4], redball[i][5], \
             blueball[i]])

處理效果:

起碼能看了qwq

總結一下:
那個時候會xpath就好了 哈哈哈哈哈哈哈