Hello everybody ! 很久沒有更新文章了,最近公司太忙了,沒得辦法。這周和一高中同學聊天,他的職業是一名律師,最近他自己在深圳創業,需要獲取“中國執行信息公開網“的一些失信公司信息,作爲一個小渣渣的我於是毛遂自薦答應幫他爬取到這些數據。當時本人心裏虛的一批,不知道憑自己的渣渣技術能不能幫助到他,但是爲了幫助好哥們創業我也就豁出去了,哈哈!
那好,首先我們看下這個網站“http://zxgk.court.gov.cn/shixin/”的大概界面顯示,我們把網頁往下拉可以看到有一欄查詢條件,其中包括“被執行人姓名”、“省份”、“身份證號碼”、“驗證碼”。在這裏我們只需要在“被執行人姓名/名稱”中輸入“深圳”,然後再輸入正確的驗證碼並點擊查詢即可獲取到查詢結果,如圖所示。
那我們現在對這個網頁有個大概的瞭解了,那我們要怎麼獲取到查詢結果中的公司名稱、立案時間和案號呢?
我們一一進行解析,這邊呢我們最主要解決的是在輸入框輸入文字和驗證碼的問題,這個驗證碼是實時、非固定的。對於文字輸入的問題我可以使用之前學過的selenium、Xpath定位元素的方法解決,那驗證碼該怎麼解決呢?這個超出我的知識範圍了,於是左思右想就想到了B站,這裏要誇讚B站真是個神奇的網站,通過網站我找到了一種最簡單的方法,就是先把當前的驗證碼進行截屏並保存到本地,然後通過input方法手動輸入驗證碼,這樣就解決了驗證碼的問題 。
那再接下來,我們在詳細講一下是怎麼通過selenium、Xpath進行元素定位的呢。這裏我使用的是Firefox瀏覽器。首先我們鼠標右擊空白界面選擇查看元素,然後點擊左上角的鼠標箭頭,然後把鼠標移動到輸入框位置,這時我們可以看到查看元素界面有個高亮顯示,大家可以看下高亮顯示的部分呢有一個id="pName" ,那我們就可以通過這個id屬性進行元素定位,同理驗證碼的輸入框是id="yzm"。我們定位到元素位置後再使用send_keys()的方法輸入文本內容就可以了。
那我們接下來就是要獲取查詢結果中的內容了,這次我們主要使用的是Xpath方法來獲取我們想要的內容,基本思路和大家說的差不多了,那開始上代碼吧!
第一部分:登錄網頁和查輸入驗證碼進入查詢結果界面:
import requests
from selenium import webdriver
from time import sleep
from PIL import Image
driver = webdriver.Firefox()
driver.get('http://zxgk.court.gov.cn/shixin/')
driver.maximize_window()
driver.find_element_by_id('pName').send_keys('深圳') #定位到“被執行人姓名/名稱”並輸入深圳
sleep(2)
'''對當前界面進行截屏'''
driver.save_screenshot('a.png')
loc = driver.find_element_by_id('captchaImg')
print(loc.location)
print(loc.size)
left = loc.location['x']
top = loc.location['y']
right = left + loc.size['width']
bottom = top + loc.size['height']
im = Image.open('a.png')
im = im.crop((left,top,right,bottom))
im.save('c.png')
sleep(2)
yzm = input('請輸入正確的驗證碼:')
sleep(5)
'''定位到驗證碼位置手動輸入驗證碼並點擊查詢'''
driver.find_element_by_id("yzm").send_keys(yzm)
driver.find_element_by_xpath("/html/body/div[2]/div/div[2]/div[3]/form/div[4]/div[6]/button").click()
第二部分:獲取查詢結果中的公司名稱、立案時間、案號
import pandas as pd
import numpy as np
name = []
time = []
anhao = []
'''定義函數'''
def get_content():
lujing = driver.find_elements_by_xpath(".//*[@id='tbody-result']/tr")
#print(lujing)
for t1 in lujing:
#公司名稱
t2 = t1.find_element_by_xpath('./td[2]').text
#print(t2)
name.append(t2)
# time = driver.find_elements_by_xpath(".//*[@id='tbody-result']/tr")
#立案時間
t3 = t1.find_element_by_xpath('./td[3]').text
time.append(t3)
#案號名稱
t4 = t1.find_element_by_xpath('./td[4]').text
anhao.append(t4)
#print(name)
# print(time)
#print(anhao)
dict1 = {'time':time,'name':name,'anhao':anhao}
print(dict1)
#使用pandas中的DataFrame進行數據保存成csv格式
df1 = pd.DataFrame.from_dict(dict1)
df1.to_csv('falv_data.csv')
第三部分:使用for循環爬取所有內容
#定位到頁面輸入框
for i in range(1,51):
sleep(3)
driver.find_element_by_xpath(".//*[@id='goto']").send_keys(i)
# sleep(3)
driver.find_element_by_xpath(".//*[@id='page-div']/div[5]/span").click()
sleep(5)
get_content()
driver.find_element_by_xpath(".//*[@id='goto']").clear()
sleep(2)
if i == 50:
driver.quit()
print("下載完成")
else:
continue
那最後是全部代碼:
import requests
from selenium import webdriver
from time import sleep
from PIL import Image
import pandas as pd
import numpy as np
driver = webdriver.Firefox()
driver.get('http://zxgk.court.gov.cn/shixin/')
driver.maximize_window()
driver.find_element_by_id('pName').send_keys('深圳')
sleep(2)
driver.save_screenshot('a.png')
loc = driver.find_element_by_id('captchaImg')
print(loc.location)
print(loc.size)
left = loc.location['x']
top = loc.location['y']
right = left + loc.size['width']
bottom = top + loc.size['height']
im = Image.open('a.png')
im = im.crop((left,top,right,bottom))
im.save('c.png')
sleep(2)
yzm = input('請輸入正確的驗證碼:')
sleep(5)
driver.find_element_by_id("yzm").send_keys(yzm)
driver.find_element_by_xpath("/html/body/div[2]/div/div[2]/div[3]/form/div[4]/div[6]/button").click()
#序號
#print(driver.find_element_by_xpath('//*[@class="moible-hide"]').text)
#公司名稱
#print(driver.find_elements_by_xpath(".//*[@id='tbody-result']/tr/td[2]"))
name = []
time = []
anhao = []
def get_content():
lujing = driver.find_elements_by_xpath(".//*[@id='tbody-result']/tr")
#print(lujing)
for t1 in lujing:
t2 = t1.find_element_by_xpath('./td[2]').text
#print(t2)
name.append(t2)
# time = driver.find_elements_by_xpath(".//*[@id='tbody-result']/tr")
t3 = t1.find_element_by_xpath('./td[3]').text
time.append(t3)
t4 = t1.find_element_by_xpath('./td[4]').text
anhao.append(t4)
#print(name)
# print(time)
#print(anhao)
dict1 = {'time':time,'name':name,'anhao':anhao}
print(dict1)
df1 = pd.DataFrame.from_dict(dict1)
df1.to_csv('falv_data.csv')
#定位到頁面輸入框
for i in range(1,51):
sleep(3)
driver.find_element_by_xpath(".//*[@id='goto']").send_keys(i)
# sleep(3)
driver.find_element_by_xpath(".//*[@id='page-div']/div[5]/span").click()
sleep(5)
get_content()
driver.find_element_by_xpath(".//*[@id='goto']").clear()
sleep(2)
if i == 50:
driver.quit()
print("下載完成")
else:
continue
那今天就到這裏了,希望以後能掌握更多技術,幫助他人和自己,哈哈!