記第一次爬蟲 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號樓16層1606
正在爬取公司的程式碼是: 000009
中國寶安集團股份有限公司 1983/07/06 zgbajt@163.net www.chinabaoan.com (+86)0755-25170300、0755-25170367 廣東省深圳市筍崗東路1002號寶安廣場A座28-29層
正在爬取公司的程式碼是: 000011
問題:雖然很簡單,但對於庫的使用不夠熟練,並且這個網頁的節點並不是都有id或class來區分它們,需遍歷相同的節點。在程式碼中經常print出當前所定位的網頁程式碼可以幫助你更快的找到正確的節點。