Maison >développement back-end >Tutoriel Python >Explication détaillée de l'exemple d'exploration de l'index python3 Baidu
Cet article présente principalement l'exploration de l'index python3 Baidu. L'éditeur pense que c'est plutôt bon. Maintenant, je vais le partager avec vous et le donner comme référence. Suivons l’éditeur et jetons un coup d’œil.
Attrapez l'index Baidu, puis utilisez la reconnaissance d'image pour obtenir l'index
Avant-propos :
Tufu a dit un jour que l'index Baidu est difficile à saisir et qu'il coûte 20 yuans par article sur Taobao Mots clés :
Comment quelqu'un pourrait-il être effrayé par lui, alors j'ai passé environ 2 jours et demi pour le terminer. Je méprise Tufu <.>
Il existe de nombreuses bibliothèques installées :谷歌图像识别tesseract-ocr pip3 install pillow pip3 install pyocr selenium2.45 Chrome47.0.2526.106 m or Firebox32.0.1 chromedriver.exeVous devez vous connecter pour accéder à l'index Baidu. Le compte de connexion et le mot de passe sont écrits dans le compte texte : <.>
Le code de connexion universel est le suivant :
# 打开浏览器 def openbrowser(): global browser # http://www.php.cn/ url = "https://passport.baidu.com/v2/?login&tpl=mn&u=http%3A%2F%2Fwww.baidu.com%2F" # 打开谷歌浏览器 # Firefox() # Chrome() browser = webdriver.Chrome() # 输入网址 browser.get(url) # 打开浏览器时间 # print("等待10秒打开浏览器...") # time.sleep(10) # 找到id="TANGRAM__PSP_3__userName"的对话框 # 清空输入框 browser.find_element_by_id("TANGRAM__PSP_3__userName").clear() browser.find_element_by_id("TANGRAM__PSP_3__password").clear() # 输入账号密码 # 输入账号密码 account = [] try: fileaccount = open("../baidu/account.txt") accounts = fileaccount.readlines() for acc in accounts: account.append(acc.strip()) fileaccount.close() except Exception as err: print(err) input("请正确在account.txt里面写入账号密码") exit() browser.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(account[0]) browser.find_element_by_id("TANGRAM__PSP_3__password").send_keys(account[1]) # 点击登陆登陆 # id="TANGRAM__PSP_3__submit" browser.find_element_by_id("TANGRAM__PSP_3__submit").click() # 等待登陆10秒 # print('等待登陆10秒...') # time.sleep(10) print("等待网址加载完毕...") select = input("请观察浏览器网站是否已经登陆(y/n):") while 1: if select == "y" or select == "Y": print("登陆成功!") print("准备打开新的窗口...") # time.sleep(1) # browser.quit() break elif select == "n" or select == "N": selectno = input("账号密码错误请按0,验证码出现请按1...") # 账号密码错误则重新输入 if selectno == "0": # 找到id="TANGRAM__PSP_3__userName"的对话框 # 清空输入框 browser.find_element_by_id("TANGRAM__PSP_3__userName").clear() browser.find_element_by_id("TANGRAM__PSP_3__password").clear() # 输入账号密码 account = [] try: fileaccount = open("../baidu/account.txt") accounts = fileaccount.readlines() for acc in accounts: account.append(acc.strip()) fileaccount.close() except Exception as err: print(err) input("请正确在account.txt里面写入账号密码") exit() browser.find_element_by_id("TANGRAM__PSP_3__userName").send_keys(account[0]) browser.find_element_by_id("TANGRAM__PSP_3__password").send_keys(account[1]) # 点击登陆sign in # id="TANGRAM__PSP_3__submit" browser.find_element_by_id("TANGRAM__PSP_3__submit").click() elif selectno == "1": # 验证码的id为id="ap_captcha_guess"的对话框 input("请在浏览器中输入验证码并登陆...") select = input("请观察浏览器网站是否已经登陆(y/n):") else: print("请输入“y”或者“n”!") select = input("请观察浏览器网站是否已经登陆(y/n):")
Connexion page :
Après vous être connecté, vous devez ouvrir une nouvelle fenêtre, c'est-à-dire ouvrir l'index Baidu et changer de fenêtre :
<.>
# 新开一个窗口,通过执行js来新开一个窗口 js = 'window.open("http://index.baidu.com");' browser.execute_script(js) # 新窗口句柄切换,进入百度指数 # 获得当前打开所有窗口的句柄handles # handles为一个数组 handles = browser.window_handles # print(handles) # 切换到当前最新打开的窗口 browser.switch_to_window(handles[-1])Effacez la zone de saisie et construisez le nombre de jours de clic :
# 清空输入框 browser.find_element_by_id("schword").clear() # 写入需要搜索的百度指数 browser.find_element_by_id("schword").send_keys(keyword) # 点击搜索 # <input type="submit" value="" id="searchWords" onclick="searchDemoWords()"> browser.find_element_by_id("searchWords").click() time.sleep(2) # 最大化窗口 browser.maximize_window() # 构造天数 sel = int(input("查询7天请按0,30天请按1,90天请按2,半年请按3:")) day = 0 if sel == 0: day = 7 elif sel == 1: day = 30 elif sel == 2: day = 90 elif sel == 3: day = 180 sel = '//a[@rel="' + str(day) + '"]' browser.find_element_by_xpath(sel).click() # 太快了 time.sleep(2)Le nombre de jours est ici :
Retrouvez la case graphique :
xoyelement = browser.find_elements_by_css_selector("#trend rect")[2]La boîte graphique est :
Construire des décalages en fonction de différents points de coordonnées :
Sélectionnez les coordonnées de 7 jours Observons :
L'abscisse du premier point est 1031.66666L'abscisse du deuxième point est 1234Donc la différence entre les deux coordonnées pour 7 jours est : 202.33, et les autres jours sont similaires
Utilisez la bibliothèque sélénium pour simuler la suspension coulissante de la souris :from selenium.webdriver.common.action_chains import ActionChains ActionChains(browser).move_to_element_with_offset(xoyelement,x_0,y_0).perform()Mais le point définitif est à cette position :
C'est à dire que le coin supérieur gauche du rectangle, qui ne sera pas chargé ici js affiche une pop-up box, il faut donc donner l'abscisse 1 :
x_0 = 1 y_0 = 0Écrivez une boucle en fonction du nombre de jours et laissez les abscisses s'accumuler :
# 按照选择的天数循环 for i in range(day): # 构造规则 if day == 7: x_0 = x_0 + 202.33 elif day == 30: x_0 = x_0 + 41.68 elif day == 90: x_0 = x_0 + 13.64 elif day == 180: x_0 = x_0 + 6.78Une boîte apparaîtra lorsque vous déplacez la souris horizontalement. Recherchez cette case dans l'URL :
Selenium reconnaît automatiquement... :
# <p class="imgtxt" style="margin-left:-117px;"></p> imgelement = browser.find_element_by_xpath('//p[@id="viewbox"]')et détermine la taille et la position de cette boîte :
# 找到图片坐标 locations = imgelement.location print(locations) # 找到图片大小 sizes = imgelement.size print(sizes) # 构造指数的位置 rangle = (int(locations['x']), int(locations['y']), int(locations['x'] + sizes['width']), int(locations['y'] + sizes['height']))Le graphique intercepté est :
L'idée suivante est :
Mais le recadrage final est la boîte noire ci-dessus, l'effet que je veux est :
J'ai donc besoin de calculer la plage, mais je suis paresseux et ignore la longueur du terme de recherche, alors j'écris directement violemment :
这个写法最终不太好,最起码要对keyword的长度进行判断,长度过长会导致截图坐标出现偏差,反正我知道怎么做,就是不写出来给你们看!
后面的完整代码是:
# <p class="imgtxt" style="margin-left:-117px;"></p> imgelement = browser.find_element_by_xpath('//p[@id="viewbox"]') # 找到图片坐标 locations = imgelement.location print(locations) # 找到图片大小 sizes = imgelement.size print(sizes) # 构造指数的位置 rangle = (int(locations['x'] + sizes['width']/3), int(locations['y'] + sizes['height']/2), int(locations['x'] + sizes['width']*2/3), int(locations['y'] + sizes['height'])) # 截取当前浏览器 path = "../baidu/" + str(num) browser.save_screenshot(str(path) + ".png") # 打开截图切割 img = Image.open(str(path) + ".png") jpg = img.crop(rangle) jpg.save(str(path) + ".jpg")
但是后面发现裁剪的图片太小,识别精度太低,所以需要对图片进行扩大:
# 将图片放大一倍 # 原图大小73.29 jpgzoom = Image.open(str(path) + ".jpg") (x, y) = jpgzoom.size x_s = 146 y_s = 58 out = jpgzoom.resize((x_s, y_s), Image.ANTIALIAS) out.save(path + 'zoom.jpg', 'png', quality=95)
原图大小请 右键->属性->详细信息 查看,我的是长73像素,宽29像素
最后就是图像识别
# 图像识别 index = [] image = Image.open(str(path) + "zoom.jpg") code = pytesseract.image_to_string(image) if code: index.append(code)
最后效果图:
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。
更多Explication détaillée de lexemple dexploration de lindex python3 Baidu相关文章请关注PHP中文网!