Live2D

Python之控制已打开浏览器以及页面点击和切换控制权

世界之大,无奇不有,各种需求也是琳琅满目,但是古人的智慧是值得敬佩的。

事件背景:当python爬虫时,遇到JS跳转,cookie等操作时,会比较复杂,需要对js有较深的理解才可以进行下午,但是世界在进步,任何一件事情慢慢都会趋向于大众化,这说起来有点想Python的诞生了,哈哈,转回正题,基于JS较为复杂,因此有了selenium,他可以控制浏览器进行页面的跳转,以及进行登录与注册等一系列模拟人的行为。有了selenium之后这些就变得比较简单,只需要对前端页面的定位了解就差不多了,慢慢的出来了验证码,这就对selenium不是很友好了,虽然有着超级鹰等打码平台,但是这是收费的,并不符合爬虫的白嫖理念,于是也有对应的解决,页面截图,OCR识图等,但这就牵扯到较为复杂的层面。于是就有了接下来的控制已有的浏览器,事先登陆注册等携带有cookie信息的浏览器再进行操作,岂不美哉。

接下来呢是以企查查为原型,进行的一些列操作,控制已登录好的企查查,进行某企业的股东、股东所占比、电话邮箱、风险事件、法人代表等信息的爬取并进行Excel的格式化存储。其中大部分较为简单,也可直接复制运行即可,只有一个难点,为浏览器的句柄,因为涉及到点击进入新页面所以要重新获取句柄并得到控制权,对新页面进行信息获取,大部分获取不到就是没有得到正确的句柄,所以定位不到数据。以下为详情代码模块。需要自取,欢迎讨论和改进,鸟叔还在成长,希望一起进步。

 #首先导入selenium以及所需要的库

from selenium import webdriver
import time
import requests
import xlrd
from docx import Document
from docx.shared import Pt
from docx.shared import Inches
from docx.oxml.ns import qn
import os
import shutil
import docx
from docx.shared import Inches
from bs4 import BeautifulSoup
import re
import datetime
import urllib.request
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.common.keys import Keys
import sys
import os
import io
import pandas as pd
import numpy as np
import re
import random
import datetime
from sqlalchemy import create_engine
# 编制获取信息函数,传参为公司名和chromdriver对象
def getMassage(Company,driver):
datacontent = {}
datacontent['公司名称'] = ''
datacontent['股东名称1'] = ''
datacontent['持股比例1'] = ''
datacontent['股东名称2'] = ''
datacontent['持股比例2'] = ''
datacontent['股东名称3'] = ''
datacontent['持股比例3'] = ''
datacontent['股东名称4'] = ''
datacontent['持股比例4'] = ''
datacontent['股东名称5'] = ''
datacontent['持股比例5'] = ''
datacontent['电话'] = ''
datacontent['邮箱'] = ''
datacontent['网址'] = ''
datacontent['法人代表'] = ''
datacontent['地址'] = ''
datacontent['注册资本'] = ''
datacontent['成立日期'] = ''
datacontent['风险信息'] = ''
datacontent['简介'] = ''
# 获取当前窗口句柄
now_handle = driver.current_window_handle
# print(now_handle)

driver.find_element_by_id('headerKey').clear()
time.sleep(1)
  

driver.find_element_by_id('headerKey').send_keys(Company)
driver.find_element_by_xpath('//span[@class="input-group-btn"]').click()
time.sleep(1)
# driver.execute_script("window.scrollBy(0,500)")

# 法定代表人
try:
Name = driver.find_element_by_xpath('//tbody[@id="search-result"]/tr[1]/td/p[@class="m-t-xs"][1]/a')
print(Name.text)
datacontent['法人代表'] = Name.text
except:
datacontent['法人代表'] = ''

# 注册资本
try:
Money = driver.find_elements_by_xpath('//tbody[@id="search-result"]/tr[1]/td/p[@class="m-t-xs"][1]//span')
print(str(Money[0].text).split(":")[1])
datacontent['注册资本'] = str(Money[0].text).split(":")[1]
except:
datacontent['注册资本'] = ''

# 成立时间
try:
print(str(Money[1].text).split(":")[1])
datacontent['成立日期'] = str(Money[1].text).split(":")[1]
except:
datacontent['成立日期'] = ''
time.sleep(1)
driver.find_element_by_xpath('//*[@id="search-result"]/tr[1]//a[@class="ma_h1"]').click()
time.sleep(2)

all_handles = driver.window_handles # 获取所有窗口句柄

for handle in all_handles:
if handle != now_handle:
# print(handle)
driver.switch_to_window(handle)
# #公司名
company = driver.find_element_by_xpath('//h1')
print(company.text)
datacontent['公司名称'] = company.text

#
# #联系电话
try:
linkMan = driver.find_element_by_xpath(
'//div[@class="dcontent"]//div[@class="row"][1]//span[@class="cvlu"]/span')
print(linkMan.text)
datacontent['电话'] = linkMan.text
except:
datacontent['电话'] = ''

#
# #联系邮箱
try:
linkEmail = driver.find_element_by_xpath(
'//div[@class="dcontent"]//div[@class="row"][2]//span[@class="cvlu"]/a[@class="text-primary"]')
print(linkEmail.text)
datacontent['邮箱'] = linkEmail.text
except:
datacontent['邮箱'] = ''
print('联系邮箱暂无')

# 官网
try:
href = driver.find_element_by_xpath(
'//div[@class="dcontent"]//div[@class="row"][1]//a[@class="text-primary"]')
print(href.text)
datacontent['网址'] = href.text
except:
datacontent['网址'] = ""
print('官网暂无')

# #地址
try:
addres = driver.find_element_by_xpath(
'//div[@class="dcontent"]//div[@class="row"][2]/span[@class="cvlu"]/a')
print(addres.text)
datacontent['地址'] = addres.text
except:
datacontent['地址'] = ""
print('地址暂无')
try:
try:
driver.find_element_by_xpath(
'//div[@class="dcontent"]//div[@class="row"][3]//span[@class="cvlu introRetract"]/a').click()
indruce = driver.find_element_by_xpath(
'//div[@class="dcontent"]//div[@class="row"][3]//span[@class="cvlu introExpand"]')
except:
# #简介
indruce = driver.find_element_by_xpath(
'//div[@class="dcontent"]//div[@class="row"][3]//span[@class="cvlu introRetract"]')
print(indruce.text)
datacontent['简介'] = indruce.text
except:
datacontent['简介'] = ''
print('简介暂无')

# 风险
Fs = driver.find_elements_by_xpath('//div[@class="bcell"]//div[@class="cont"]//span[@class="fx2-tx"]')
for i in Fs:
datacontent['风险信息'] = datacontent['风险信息'] + str(i.text) + ";"

# 股东信息
length = len(driver.find_elements_by_xpath('//*[@id="partnerslist"]/table/tbody//tr//td[@class="tx"]'))
# print(length)
if length > 5:
length = 5
for i in range(1, 6):
if i > length:
compamy1 = '空'
precent1 = '空'
else:
company1 = driver.find_element_by_xpath(
'//*[@id="partnerslist"]/table/tbody/tr[{}]//h3'.format(i + 1))
print(company1.text)
try:
datacontent['股东名称'+str(i)] = company1.text
except:
datacontent['股东名称' + str(i)] = ''
try:
pat = re.compile('\d+')
precent = driver.find_element_by_xpath(
'//*[@id="partnerslist"]/table/tbody/tr[{}]//td[@class="text-center"][1]'.format(i + 1))
print(pat.findall(str(precent.text))[0] + '%')
datacontent['持股比例' + str(i)] = pat.findall(str(precent.text))[0] + '%'
except:
datacontent['持股比例' + str(i)] = ''
time.sleep(1)
driver.close()
time.sleep(1)
driver.switch_to_window(now_handle)
return datacontent

# 将数据保存至excel中
def putDataIntoExcel(dataContents, fileName):
save = pd.DataFrame(dataContents, columns=titles)
file = open(fileName, "a", encoding='utf-8')
save.to_csv(file, line_terminator="\n", index=False)
file.close()
print("鸟叔的公司完成")
if __name__ == "__main__":
titles = [
'公司名称',
'股东名称1',
'持股比例1',
'股东名称2',
'持股比例2',
'股东名称3',
'持股比例3',
'股东名称4',
'持股比例4',
'股东名称5',
'持股比例5',
'电话',
'邮箱',
'网址',
'法人代表',
'地址',
'注册资本',
'成立日期',
'风险信息',
'简介',
]
#读取csv
data11 = pd.read_excel('./鸟叔公司类表.xlsx', encoding='gb18030')
data11 = data11.iloc[:,0]
companyList = list(data11)
print(len(companyList),companyList)
sys.stdout = io.TextIOWrapper(sys.stdout.buffer, encoding='gb18030')
  #获取浏览器控制权

chrome_options = Options()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(chrome_options=chrome_options)
listData = []
for data1 in companyList[101:]:
print(data1)
try:
message = getMassage(data1,driver)
listData.append(message)
except:
print(data11,"没有数据")
continue
#若数据量较大,可在此进行数据的切分爬取,避免爬取进度为百分之95时出现爬取数据上限
  #但是没有进行存储的尴尬费事费力不讨好,自测三千六百左右一个账号就会暂时不能进行正常爬取

# putDataIntoExcel(listData, './鸟叔爬取公司.csv')
# print(len(listData),listData)

  #由于data直接转excel数据格式有报错,此处先转成csv格式最后变成excel,可分步进行,

# data = pd.read_csv('./鸟叔爬取公司.csv',engine='python',encoding='utf8')
# # print(data)
# data.to_excel('./鸟叔爬取公司.xlsx',index=False,encoding="gb18030")

posted @ 2020-08-18 14:07  鸟-叔  阅读(2553)  评论(0编辑  收藏  举报