1. 程式人生 > >Python之爬蟲-- etree和XPath實戰

Python之爬蟲-- etree和XPath實戰

下面程式碼是在網站上找到的一個例子,空閒的時候可以自己除錯。 

# -*- coding:utf-8 -*-
""" 爬蟲 創業邦 創業公司資訊爬取
網頁url = 'http://www.cyzone.cn/vcompany/list-0-0-1-0-0/0'
爬取頁面中的創業公司,融資階段,創業領域,成立時間和創業公司的連結資訊。
使用到requests, json, codecs, lxml等庫
requests用於訪問頁面,獲取頁面的原始碼
josn庫用於寫入json檔案儲存到本地
codecs庫用於讀寫檔案時編碼問題
lxml用於解析網頁原始碼,獲取資訊
"""
import requests
import json
import codecs
from lxml import etree
 
 
class chuangYeBang:
    def __init__(self):
        pass
 
    def get_html(self, url):
        """ get_html
        得到網頁原始碼,返回unicode格式
        
        @param: url
        @return: r.text <type 'unicode'>
        """
        headers = {
            "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64)"
            "AppleWebKit/537.36 (KHTML, like Gecko)"
            "Chrome/63.0.3239.26 Safari/537.36 Core/1.63.6721.400"
            "QQBrowser/10.2.2243.400"
        }
        r = requests.get(url, headers=headers)
        print r.status_code
        return r.text
 
    def get_company_data(self, text):
        """ get_company_data
        得到網頁資訊
        eg: [{
            "companyUrl": "http://www.cyzone.cn/r/20180824/68979.html", 
            "stage": "天使輪", 
            "type": "硬體", 
            "time": "2014-12-19", 
            "companyName": "成都思科"
        }]
        @param: text 網頁的原始碼unicode格式原始碼
        @return: list 一個頁面所有的公司資訊 列表中每一個元素為存入資訊的字典
        """
        html = etree.HTML(text)  # 解析網頁
        company_name_list = html.xpath(
            '//td[@class="table-company-tit"]/a/span/text()'
            )
        # 得到帶有class"table-company-tit"...屬性的td標籤下的a標籤下的span標籤的內容,返回為一個列表
        print company_name_list  # get companyName list
        print len(company_name_list)
 
        company_url_list = html.xpath(
            '//td[@class="table-company-tit"]/a/@href'
            )
        """
        得到帶有..屬性的td標籤下的a標籤中hred的內容
        為一個url
        <a href="http://www.cyzone.cn/r/20180823/68963.html" target="_blank">
        """
        print company_url_list
 
        stage_list = html.xpath('//td[@class="table-stage"]/@data-stage')
        # 同上 不解釋了 得到stage
        company_stage_list = []
        for company_stage in stage_list:
            company_stage = company_stage.strip(',') if company_stage else None
            company_stage_list.append(company_stage)
        print company_stage_list  # get stage list
        print len(company_stage_list)
 
        company_type_list = html.xpath('//td[@class="table-type"]')
        type_list = []
        for company_type in company_type_list:
            company_type = company_type.xpath('./a/text()')[0] \
                if company_type.xpath('./a/text()') else None
            type_list.append(company_type)
        print type_list
        print len(type_list)
 
        company_time_list = html.xpath('//td[@class="table-time"]/text()')
        print company_time_list
        print len(company_time_list)
 
        """
        遍歷每個列表,取出列表對應的元素,組成我們需要的字典
        """
        ret_company_list = []
        for i in range(20):
            single_company = {}
            single_company['companyUrl'] = company_url_list[i]
            single_company['companyName'] = company_name_list[i]
            single_company['type'] = type_list[i]
            single_company['stage'] = company_stage_list[i]
            single_company['time'] = company_time_list[i]
            ret_company_list.append(single_company)
 
        return ret_company_list
 
    def write_in_json(self, data):
        """ write_in_json
        寫入json檔案
        codecs  # 用於編碼,同一用utf-8格式編碼
        json.dumps  # 方法用於將字典或者列表轉換成json字串格式,存入json檔案
        indent=2  # json檔案中顯示的方法,顯示為2字元的鎖緊
        .decode('unicode_escape')  # 在json檔案中顯示中文,不會顯示utf-8編碼,方便看。
        """
        json_data = json.dumps(data, indent=2).decode('unicode_escape')
        with codecs.open('./chuangYeBang.json', 'w', 'utf-8') as fw:
            fw.write(json_data)
 
 
class getCompanyInfo:
    """ 得到每個公司詳細資訊 """
    def __init__(self):
        pass
 
    def get_html_text(self, url):
        headers = {}
        r = requests.get(url, headers=headers)
        print r.status_code
        return r.text
 
    def get_company_info(self, text):
        pass
 
 
if __name__ == "__main__":
    cyb = chuangYeBang()
    url = 'http://www.cyzone.cn/vcompany/list-0-0-1-0-0/0'
    text = cyb.get_html(url)
    data = cyb.get_company_data(text)
    cyb.write_in_json(data)