python爬蟲入門訓練-2

簡介

這次的爬蟲訓練是對豆瓣top250信息的爬取,比較簡單的靜態頁面的爬取,本人也是初學者,爲了防止學習的困難,我儘量寫的詳細點,建議先把代碼複製一遍,看能不能成功運行,再過來看,免得到時候全部看完了,代碼不能運行,到時候自己解決也是蠻麻煩的,畢竟爬蟲更新換代也是蠻快的

目標需求

對豆瓣top250所有信息進行爬取,包括影名、格言、評分,先存爲.csv文件,最後轉爲excel表格存儲

運用知識

requests庫,lxml解析庫,csv文件保存

分析

1.進入到豆瓣top250主界面,進行如下操作,基本得到了我們需要信息的源碼
在這裏插入圖片描述
2.分析每一頁的url,找出相應規律
第一頁:
在這裏插入圖片描述
第二頁:
在這裏插入圖片描述

我們發現start=0和start=25有所不同,其餘都是一樣的,我們陸續查看後面幾頁url,發現start的值以25遞增,由此我們可以推出各頁的url

源碼部分

有部分註釋

import requests
import csv
from lxml import etree

# 得到第i頁的源代碼
def get_resource(page): # 傳入參數爲頁數
    headers = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/75.0.3770.142 Safari/537.36'
    } # 設置請求頭
    page_head=page*25
    page_url = 'https://movie.douban.com/top250?start=%d&filter=' % page_head # 得到每頁的url
    try:
        response = requests.get(page_url, headers=headers)  # 加個請求頭,僞裝一下,否則會被識別出來,具體錯誤可看返回的狀態碼
        response.raise_for_status() # 若返回狀態碼不是200,則拋出異常
        response.encoding =response.apparent_encoding # 設置編碼格式和網站編碼格式相同,防止後面亂碼
    except Exception as e:
        print('爬取失敗')
    else:
        return response.text # 爬取成功,則返回該頁源碼信息

#信息處理,並寫入csv文件
def handle_info(i,selector):
        selector = etree.HTML(selector) # 構造一個xpath解析對象
        number = selector.xpath('//em/text()')
        name = selector.xpath('//span[@class="title"][1]/text()')
        motto = selector.xpath('//span[@class="inq"]/text()')
        score = selector.xpath('//span[@class="rating_num"]/text()')

        # 多次調試後,發現第240,242,247,250個沒有格言,我們把其設置爲空,否則後面會亂
        # 第九頁,它們的motto下標分別爲 14,16,21,24
        if i==9:
            motto.insert(14, " ");
            motto.insert(16, " ");
            motto.insert(21, " ");
            motto.insert(24, " ");

        for m in range(25):
            all_info = [number[m], name[m], motto[m], score[m]] # 形成列表,後面插入
            with open('douban_top250.csv', 'a+', newline='', encoding='utf-8') as csvfile:
                writer = csv.writer(csvfile)
                writer.writerow(all_info) # 按行寫入

if __name__=='__main__':
    # 寫入第一行,確定每列名稱
    with open('data.csv', 'w', newline='', encoding='utf-8') as csvfile:
        writer = csv.writer(csvfile)
        writer.writerow(['number', 'name', 'motto', 'score'])

    # 一共10頁
    for i in range(0,10):
        selector=get_resource(i)
        handle_info(i,selector)

代碼部分額外解釋

  • name = selector.xpath(’//span[@class=“title”][1]/text()’):
    在這裏插入圖片描述
    在span標籤,且其class屬性值爲title,有兩個滿足該條件的,我們取第一個,text()表示取其文本值
  • motto = selector.xpath(’//span[@class=“inq”]/text()’):
    在這裏插入圖片描述
    在span標籤,且其class屬性值爲inq,text()表示取其文本值
  • with open(‘douban_top250.csv’, ‘a+’, newline=’’, encoding=‘utf-8’) as csvfile:該句中newline=’’,防止每寫入一行,就插入一個空行,encoding='utf-8’保證編碼格式的統一

實現效果

解決excel打開csv文件亂碼,並保存爲excel文件
pycharm中打開csv文件:
在這裏插入圖片描述
excel文件:
在這裏插入圖片描述

結語

本程序中對lxml未得到的格言,手動查找,以空格賦值,不是很恰當,我也是想不出什麼好辦法,才這麼寫的,有其他解決辦法,望告知!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章