Python selenium爬虫抓取船舶网站数据(动态页面)

时间:2021-09-12 08:01:41

很早之前就开始学习爬虫了,一直想学习爬取动态页面,正巧工作中需要用到一个船舶信息的网站,每次都是手动查询太麻烦了,昨天下午研究了一下午,总算搞透彻了,基本步骤如下:
1、启动浏览器
2、打开网页
3、模拟输入,模拟点击
4、稍等一会(很重要)
5、获取网页数据
6、清洗数据

代码分两部分,一部分保存为函数(Chrome_shipxy.py),另一部分作为程序调用函数,这样方便扩展多进程使用。

from selenium.webdriver.common.keys import Keys
from selenium import webdriver
import time

def func01(html): #拆分字符串

    line='';html2=[];bj=0;
    for j in range(0,len(html)):

        if bj==0 and html[j:j+1]=='<':
            line=line+html[j:j+1];bj=1;continue

        if html[j:j+1]!='<':
            line=line+html[j:j+1];continue

        if bj==1 and html[j:j+1]=='<':
            html2.append(line);
            line='';line=line+html[j:j+1];bj=1;
    html2.append(line);line='';
    return html2

def func02(html2): #筛选需要信息

    sxzd=['si_mmsiFlag','si_shipType','si_shipStatus','si_length','si_beam','si_lat','si_lng','si_lastTime']; #国籍,类型,状态,船长,船宽,纬度,经度,最后时间
    wb1=[];wb2=[];
    for i in sxzd:
        bj=0;
        for j in html2:
            if i in j:
                wb1.append(j);bj=1;
        if bj==0:
            wb1.append('>无信息');
    for j in wb1:
        for i in range(0,len(j)):
            if j[i:i+1]=='>':
                wb2.append(j[i+1:len(j)])
    return wb2

def func03(ship_name,wait_time): #主函数

    obj = webdriver.Chrome()
    obj.set_page_load_timeout(10)

    try:

        obj.get('http://www.shipxy.com/')
        obj.set_page_load_timeout(20)

        obj.find_element_by_id('txtKey').clear()   #用于清除输入框的内容,相当于clear()
        obj.find_element_by_id('txtKey').send_keys(ship_name)   #在输入框内输入Hello
        obj.find_element_by_id('butnQuery').send_keys(Keys.ENTER) #通过定位按钮,通过enter(回车)代替click
        time.sleep(wait_time) #让子弹飞一会儿(很重要)

        html = obj.page_source
        time.sleep(2)

        html2=func01(html)
        html3=func02(html2)
        html3.insert(0,ship_name)

    except Exception as e:
        html3=['未获取到信息','无信息'];#print(e);
    finally:
        obj.close()
        obj.quit()
        return html3
import Chrome_shipxy

if __name__=='__main__':

    ship_name=['SHINANO MARU','SEROJA LIMA','宝鑫通','桂翔1','嘉远3','建功308','顺恩','西马11','鑫源盛','兴达888','兴宁20','豫信货12262','忠泰'];
    for j in ship_name:
        html3=Chrome_shipxy.func03(j,5)
        if '无信息' in html3[1]:
            for i in range(6,31,2):
                html3=Chrome_shipxy.func03(j,i)
                if '无信息' not in html3[1]:
                    break
        print(html3)