一個簡單的python爬蟲程序

python|網絡爬蟲html

概述

這是一個簡單的python爬蟲程序,僅用做技術學習與交流,主要是經過一個簡單的實際案例來對網絡爬蟲有個基礎的認識。python

什麼是網絡爬蟲

簡單的講,網絡爬蟲就是模擬人訪問web站點的行爲來獲取有價值的數據。專業的解釋:百度百科web

分析爬蟲需求

肯定目標

爬取豆瓣熱度在Top100之內的電影的一些信息,包括電影的名稱、豆瓣評分、導演、編劇、主演、類型、製片國家/地區、語言、上映日期、片長、IMDb連接等信息。ajax

分析目標
  1. 藉助工具分析目標網頁 首先,咱們打開豆瓣電影·熱門電影,會發現頁面總共20部電影,但當查看頁面源代碼當時候,在源代碼中根本找不到這些電影當信息。這是爲何呢?原來豆瓣在這裏是經過ajax技術獲取電影信息,再動態的將數據加載到頁面中的。這就須要藉助Chrome的開發者工具,先找到獲取電影信息的API。 查找電影信息API<br/><br/> 而後對電影詳情頁進行分析<br/> 詳情頁分析

思路分析

思路

具體實現

開發環境

python3.6 <br/> pycharm<br/>json

主要依賴庫

urllib -- 基礎性的網絡相關操做<br/> lxml -- 經過xpath語法解析HTML頁面<br/> json -- 對經過API獲取的JSON數據進行操做<br/> re -- 正則操做api

代碼實現
from urllib import request
from lxml import etree
import json
import re
import ssl


# 全局取消證書驗證
ssl._create_default_https_context = ssl._create_unverified_context


def get_headers():
    """
    返回請求頭信息
    :return:
    """
    headers = {
        'User-Agent': "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_6) "
                      "AppleWebKit/537.36 (KHTML, like Gecko) "
                      "Chrome/65.0.3325.181 Safari/537.36"
    }
    return headers


def get_url_content(url):
    """
    獲取指定url的請求內容
    :param url:
    :return:
    """
    content = ''
    headers = get_headers()
    res = request.Request(url, headers=headers)
    try:
        resp = request.urlopen(res, timeout=10)
        content = resp.read().decode('utf-8')
    except Exception as e:
        print('exception: %s' % e)
    return content


def parse_content(content):
    """
    解析網頁
    :param content:
    :return:
    """
    movie = {}
    html = etree.HTML(content)
    try:
        info = html.xpath("//div[@id='info']")[0]
        movie['director'] = info.xpath("./span[1]/span[2]/a/text()")[0]
        movie['screenwriter'] = info.xpath("./span[2]/span[2]/a/text()")[0]
        movie['actors'] = '/'.join(info.xpath("./span[3]/span[2]/a/text()"))
        movie['type'] = '/'.join(info.xpath("./span[@property='v:genre']/"
                                            "text()"))
        movie['initialReleaseDate'] = '/'.\
            join(info.xpath(".//span[@property='v:initialReleaseDate']/text()"))
        movie['runtime'] = \
            info.xpath(".//span[@property='v:runtime']/text()")[0]

        def str_strip(s):
            return s.strip()

        def re_parse(key, regex):
            ret = re.search(regex, content)
            movie[key] = str_strip(ret[1]) if ret else ''

        re_parse('region', r'<span class="pl">製片國家/地區:</span>(.*?)<br/>')
        re_parse('language', r'<span class="pl">語言:</span>(.*?)<br/>')
        re_parse('imdb', r'<span class="pl">IMDb連接:</span> <a href="(.*?)" '
                         r'target="_blank" rel="nofollow">')
    except Exception as e:
        print('解析異常: %s' % e)
    return movie


def spider():
    """
    爬取豆瓣前100部熱門電影
    :return:
    """
    recommend_moives = []
    movie_api = 'https://movie.douban.com/j/search_subjects?' \
                'type=movie&tag=%E7%83%AD%E9%97%A8&sort=recommend' \
                '&page_limit=100&page_start=0'
    content = get_url_content(movie_api)
    json_dict = json.loads(content)
    subjects = json_dict['subjects']
    for subject in subjects:
        content = get_url_content(subject['url'])
        movie = parse_content(content)
        movie['title'] = subject['title']
        movie['rate'] = subject['rate']
        recommend_moives.append(movie)
        print(len(recommend_moives))
    print(recommend_moives)


if __name__ == '__main__':
    spider()

效果

抓取結果

總結

本文較詳細的闡述了一個爬蟲從需求->分析->實現的過程,並給出了具體的代碼實現。經過對本文的學習,咱們能夠了解到網絡爬蟲的一些基本的知識,以及python的一些基本庫的使用方法。接下來我會使用一些高級些的網絡操做相關的庫以及對抓取到的數據作個存儲的方式,來更深層次的理解python網絡爬蟲。網絡

特別聲明
1. 本文涉及到的豆瓣網是國內知名網站,如有侵權之處,請告知。
2. 本文屬做者原創,轉載請標明出處;未經容許,不得用於商業用途。
3. 本文只是用做網絡爬蟲技術學習交流,讀者涉及到的任何侵權問題,與本文做者無關。

<hr> 筆者對應的[簡書文章](https://www.jianshu.com/p/fc22c0ffe65b)app

相關文章
相關標籤/搜索