1. 程式人生 > >記第一次爬蟲 python3.6+pyquery

記第一次爬蟲 python3.6+pyquery

爬取深市上市公司資訊

從安裝python開始最基本的語法到開始在網上爬取資訊才過去一週,好多東西還沒有系統的學習,沒有太深的見解,還需繼續努力。

1. 開發環境的配置

所安裝的python版本是3.6,關於各種庫的安裝,參考了《Python3網路爬蟲開發實戰》。 所涉及的庫:

  • Selenium 其是自動化測試工具,可以實現驅動瀏覽器執行特定動作。 下載地址

  • Chrome 谷歌瀏覽器(現在的chromedriver可以支援到69版本)

  • ChromeDriver chromeDriver下載地址 找到瀏覽器對應的版本下載,解壓後將chromedriver.exe 移動到Python 安裝目錄下的Scripts 目錄下。

  • pyquery 網頁解析工具,pip install pyquery 即可 對於資料的儲存採用的是將資料存放到.csv 檔案中。

2. 所爬網址分析

對於上市公司的資訊,證監局制定了幾個網站,我採用的是巨潮資訊網址主要是為了學習初步簡單的爬蟲,也可以用其他的網站。這個網頁的資訊是公司程式碼和名稱的列表。 這裡寫圖片描述 我的思路是先試著爬取這個頁面下800多個公司的資訊,得到了這些公司的程式碼(000001),再去右上方的位置輸入並搜尋。最後發現 搜尋之後的網址是:http://www.cninfo.com.cn/cninfo-new/snapshot/companyDetailCn?code=000001,發現所有的公司資訊頁面的Url只是最後的code=? 不同,所以可以拿著程式碼分別去展示公司資訊的頁面爬取。

from selenium import webdriver
from pyquery import  PyQuery as pq
from  selenium.webdriver.support.wait import  WebDriverWait
from  selenium.webdriver.support import  expected_conditions as EC
from  selenium.webdriver.common.by import By
import csv
browser = webdriver.Chrome()

wait =WebDriverWait(browser, 3
) #等待時間 def id_get(): # 中國證監會網址首頁 browser.get('http://www.cninfo.com.cn/cninfo-new/snapshot/companyListCn') # 從網頁中爬出來 上市公司程式碼 和公司名 存到csv中 doc = pq(browser.page_source) item = doc('.company-list') lis= item.children() #print(lis) #獲取資訊 with open('data.csv', 'w', encoding='utf-8') as csvfile: writer=csv.writer(csvfile) writer.writerow(['id', 'name']) for tag in lis.items(): print(len(tag.text())) str1,str2 = str(tag.text()).split('\xa0') #print(str[0:6]) writer.writerow([str1, str2])

doc中引數是根據網頁的程式碼,所要爬取的資訊在ul class=”“company-list>li…/li><.ul 中。

3. 資訊的存取

資訊頁面 可以看到,公司的成立日期,郵箱等等都在table 中,類似的直接定位到 tr class=“evenrowcolor” 上,
def info_get(id):

    print('正在爬取公司的程式碼是:', id)
    #輸入程式碼查詢網頁
    try:
        purl = 'http://www.cninfo.com.cn/cninfo-new/snapshot/companyDetailCn?code='+id
        browser.get(purl)

        wait.until(
            EC.presence_of_element_located((By.CSS_SELECTOR, '.cn'))
        )
        #定位節點
        '''input = browser.find_element_by_id('hdy-input')
                                input.send_keys('000001')

                                button = browser.find_element_by_class_name('search-button')
                                button.click()'''
        doc = pq(browser.page_source)

        # 獲取公司名
        name = doc('.middle-name')

        #print(name.text())

        # 定位到td所在點
        information = doc('.evenrowcolor .text-align-left')
        # 成立日期 郵箱 網址 電話
        date = information.eq(1)
        mail = information .eq(3)
        internet = information.eq(5)
        phone = information.eq(7)

        info2 = doc('.oddrowcolor .text-align-left')
        address = info2.eq(5)

       # 存入檔案和爬取id時相似print(name.text(), date.text(), mail.text(), internet.text(),  phone.text(), address.text())

    except TimeoutError:
        info_get(id)

所注意的是,class=“evenrowcolor” 不是隻有一個標籤,所以首先定位到 這些td上,並且 成立日期,1987/12/22 這兩個標籤都不能直接區分出來,所以用date = information.eq(1) 來選擇所需的節點。

正在爬取公司的程式碼是: 000001
平安銀行股份有限公司 1987/12/22 [email protected].com.cn www.bank.pingan.com (+86)755-82080386 廣東省深圳市羅湖區深南東路5047號
正在爬取公司的程式碼是: 000002
萬科企業股份有限公司 1984/05/30 [email protected].com www.vanke.com (+86)755-25531696 廣東省深圳市鹽田區大梅沙環梅路33號萬科中心
正在爬取公司的程式碼是: 000006
深圳市振業(集團)股份有限公司 1989/04/01 szzygp@126.com www.zhenye.com (+86)755-25863012 廣東省深圳市羅湖區寶安南路2014號振業大廈B座11-17層
正在爬取公司的程式碼是: 000008
神州高鐵技術股份有限公司 1989/10/11 [email protected].163.com www.shenzhou-gaotie.com (+86)10-56500561 北京市海淀區高梁橋斜街59號院1號樓161606
正在爬取公司的程式碼是: 000009
中國寶安集團股份有限公司 1983/07/06 zgbajt@163.net www.chinabaoan.com (+86)0755-251703000755-25170367 廣東省深圳市筍崗東路1002號寶安廣場A座28-29層
正在爬取公司的程式碼是: 000011

問題:雖然很簡單,但對於庫的使用不夠熟練,並且這個網頁的節點並不是都有id或class來區分它們,需遍歷相同的節點。在程式碼中經常print出當前所定位的網頁程式碼可以幫助你更快的找到正確的節點。