python讀取excel的公司名稱信息,並爬蟲獲取公司的經營範圍信息,回填到excel中

本文作者:是老王吖
原文鏈接: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只是個閒時愛好,不專業,有不對的地方歡迎大佬們指正,共同進步。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章