很早之前就开始学习爬虫了,一直想学习爬取动态页面,正巧工作中需要用到一个船舶信息的网站,每次都是手动查询太麻烦了,昨天下午研究了一下午,总算搞透彻了,基本步骤如下:
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)