本文作者:是老王吖
原文鏈接:https://blog.csdn.net/jdkss/article/details/106077755?utm_source=app
1、項目需求
項目需求:這個問題是朋友託我幫完成一份地區教育類型公司的經營範圍。
已有信息:表中已經有了公司的名稱及地點等信息。
缺省信息:但是還缺少經營範圍。
出現的問題:由於數據量比較大,一個一個的去百度搜再複製到表裏,工作量有點大,可能需要我好幾天不吃不喝的Ctrl c、Ctrl v,這樣顯然不是個好辦法。
解決辦法:我們可以利用python從excel中把公司名稱都讀出來,然後讓它自動去網頁中,搜索獲取該公司的經營範圍,並批量回填到excel中。
2、完成步驟
拿到這個問題,我首先想到的是利用selenium自動化測試工具。可以利用該工具,模擬人爲操作瀏覽器,來獲取公司的經營範圍,並將獲取到的數據抓取下來,批量填回到excel中。
1)安裝selenium模塊和下載chromedriver驅動
① 安裝selenium庫
② 下載chromedriver驅動
下載地址:http://chromedriver.storage.googleapis.com/index.html
注意事項一:下載的chromedriver驅動必須和谷歌瀏覽器相匹配。
注意事項二:下載好的chromedriver.exe文件,需要放到python的安裝路徑下或者scripts目錄下(如圖所示)。
接着,進行一個小的測試。導入webdriver後,我們先利用代碼看看是否可以打開瀏覽器。如果可以正常打開,說明selenium安裝配置沒有問題。
from selenium import webdriver
browser = webdriver.Chrome()
首先,在編輯器中輸入以下代碼。
可以看到”谷歌瀏覽器“被自動打開了。
上面只是做了一個小的測試。下面我們以訪問”百度“爲例,做一個簡單的說明。
from selenium import webdriver
# 打開谷歌瀏覽器
browser = webdriver.Chrome()
try:
# 獲取訪問地址www.baidu.com
browser.get("https://www.baidu.com")
# 通過id獲取到百度搜索輸入框並賦予搜索條件
browser.find_element_by_id('kw').send_keys('python')
# 通過id獲取到搜索按鈕並賦予點擊操作
browser.find_element_by_id('su').click()
except Excception as e:
print("搜索失敗:{}".format(e))
可以看到:瀏覽器被成功打開,同時也打開了”百度“的頁面。同時在輸入框中自動輸入了”python“二字,併成功點擊進行了搜索。
至於怎麼定位到百度瀏覽器輸入框和搜索按鈕的id,我們可以通過F12查看頁面元素來獲取
其實,進行界面定位的方式有很多,我們選取自己最喜歡、最熟悉的方式即可。下面我列舉了一些定位方法,大家可以自行下去嘗試。
find_element_by_id
find_element_by_name
find_element_by_xpath
find_element_by_link_text
find_element_by_partial_link_text
find_element_by_tag_name
find_element_by_class_name
find_element_by_css_selector
2)進入主題(分析思路)
好了!基礎的搜索步驟已經差不多了,我們來進入正題,公司經營範圍一般我們可以去百度信譽去查詢,百度信譽的網址: https://xin.baidu.com/
我們看到:這個查詢是直接把查詢條件拼接在地址後面的一個get請求,這樣就說明我們根本就不需要通過模擬瀏覽器去查詢數據了,直接請求這個地址就可以獲取到數據了,瞬間工作量少了很多哈哈哈哈,那我們就開始吧。
既然直接請求地址獲取數據,那我們就解析獲取到的數據拿到我們想要的東西就好了,這裏我習慣用xpath來解析,感興趣的也可以用正則等其他方法解析。我需要企業的經營範圍信息,那麼F12選中經營範圍元素,我們要的數據就是這個,右擊這個標籤選擇Copy選項 --> Copy XPath複製這個標籤的xpath信息。
我們通過xpath去解析頁面內容需要先安裝一下lxml模塊和requests模塊
獲取到xpath=/html/body/div[2]/div/div[2]/div[5]/div[1]/div[1]/div[2]/div/div[1]/span[5]/span[2],然後後面接上text()便可以獲取到標籤的文本信息了
from lxml import etree
import requests
root = etree.HTML(requests.get("https://xin.baidu.com/s?q="+"百度").text)
scope = root.xpath("/html/body/div[2]/div/div[2]/div[5]/div[1]/div[1]/div[2]/div/div[1]/span[5]/span[2]/text()")
print(scope)
獲取到的內容如下
但是我們仔細一看,這裏獲取到的經營範圍是帶了省略號的,所以是不完整的,我們再看看頁面,發現頁面上外面的標籤中才是完整的信息,但是此時我們用text()是獲取不到的,這個時候得用@來選擇屬性,獲取data-content中的信息
修改後的代碼
from lxml import etree
import requests
root = etree.HTML(requests.get("https://xin.baidu.com/s?q="+"百度").text)
scope = root.xpath("/html/body/div[2]/div/div[2]/div[5]/div[1]/div[1]/div[2]/div/div[1]/span[5]/@data-content")
print(scope)
單條數據的獲取我們已經可以實現了,接下來我們就可以進行批量操作了,把查詢到參數換成可變的從excel中讀取的,我們先來實現從excel中讀取到數據吧,開幹。
讀取excel我這裏用的是xlrd模塊,先安裝一下
我們把excel表中的數據讀出來打印出來看一下,表格信息大致如下
import xlrd
#讀取本地的excel文件
wb = xlrd.open_workbook("教育類.xls",formatting_info=True)
#獲取sheet1
sheet = wb.sheet_by_index(0)
#遍歷每行數據
for i in range(sheet.nrows):
if(i!=0):
#獲取到excel表中的第三列的數據
query = sheet.cell_value(i,2)
print(query)
查詢的參數我們也讀出來了,下面可以先把這塊的代碼合二爲一,批量獲取經營範圍數據,這裏爲了方便我就先不寫成獨立的方法了,直接放在一起了
import xlrd
from lxml import etree
import requests
import time
#讀取本地的excel文件
wb = xlrd.open_workbook("教育類.xls",formatting_info=True)
#獲取sheet1
sheet = wb.sheet_by_index(0)
#遍歷每行數據
for i in range(sheet.nrows):
if(i!=0):
#獲取到excel表中的第三列的數據
query = sheet.cell_value(i,2)
print(query)
root = etree.HTML(requests.get("https://xin.baidu.com/s?q="+query).text)
scope= root.xpath("/html/body/div[2]/div/div[2]/div[5]/div[1]/div[1]/div[2]/div/div[1]/span[5]/@data-content")
data.append(scope[0])
time.sleep(1)
print(data)
data輸出是一個數組,存儲着excel表中所有公司的經營範圍信息
數據有了,接下來我們就把數據寫入excel中,把數據完善,首先得安裝寫excel的xlwt模塊。
我們寫入的方法是利用複製一份寫入數據再覆蓋的方法,所以還得安裝xlutils模塊使用它的copy方法
完整的代碼如下
import xlrd
import xlwt
from lxml import etree
import requests
import time
from xlutils.copy import copy
wb = xlrd.open_workbook("教育類.xls",formatting_info=True)
sheets = wb.sheet_names()
sheet = wb.sheet_by_index(0)
data = []
for i in range(sheet.nrows):
if(i!=0):
query = sheet.cell_value(i,2)
root = etree.HTML(requests.get("https://xin.baidu.com/s?q="+query).text)
scope = root.xpath("/html/body/div[2]/div/div[2]/div[5]/div[1]/div[1]/div[2]/div/div[1]/span[5]/@data-content")
data.append(scope[0])
time.sleep(1)
wb = xlrd.open_workbook("教育類.xls",formatting_info=True)
old = copy(wb)
ws = old.get_sheet(0)
for j in range(len(data)):
print(data[j])
print('\n')
ws.write(j+1,7,data[j])
old.save("教育類.xls")
運行結束之後可以發現excel中的經營範圍已經有數據了,整個過程就結束了,收工。
代碼比較簡單隨意,主要是一個思路,本人也是個初學者,python只是個閒時愛好,不專業,有不對的地方歡迎大佬們指正,共同進步。