Maison >développement back-end >Tutoriel Python >Explication détaillée de l'exemple d'exploration de l'index python3 Baidu

Explication détaillée de l'exemple d'exploration de l'index python3 Baidu

高洛峰
高洛峰original
2017-02-14 13:42:122785parcourir

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 :

Explication détaillée de lexemple dexploration de lindex python3 Baidu

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.exe
Vous devez vous connecter pour accéder à l'index Baidu. Le compte de connexion et le mot de passe sont écrits dans le compte texte : <.>


Explication détaillée de lexemple dexploration de lindex python3 BaiduLe 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(&#39;等待登陆10秒...&#39;)
  # 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 :


Explication détaillée de lexemple dexploration de lindex python3 BaiduAprè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 = &#39;window.open("http://index.baidu.com");&#39;
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 = &#39;//a[@rel="&#39; + str(day) + &#39;"]&#39;
browser.find_element_by_xpath(sel).click()
# 太快了
time.sleep(2)
Le nombre de jours est ici :


Retrouvez la case graphique : Explication détaillée de lexemple dexploration de lindex python3 Baidu


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 : Explication détaillée de lexemple dexploration de lindex python3 Baidu


Sélectionnez les coordonnées de 7 jours Observons : Explication détaillée de lexemple dexploration de lindex python3 Baidu

L'abscisse du premier point est 1031.66666

L'abscisse du deuxième point est 1234


Donc la différence entre les deux coordonnées pour 7 jours est : 202.33, et les autres jours sont similairesExplication détaillée de lexemple dexploration de lindex python3 Baidu

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 : Explication détaillée de lexemple dexploration de lindex python3 Baidu


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.78
Une boîte apparaîtra lorsque vous déplacez la souris horizontalement. Recherchez cette case dans l'URL :


Selenium reconnaît automatiquement... : Explication détaillée de lexemple dexploration de lindex python3 Baidu


# <p class="imgtxt" style="margin-left:-117px;"></p>
imgelement = browser.find_element_by_xpath(&#39;//p[@id="viewbox"]&#39;)
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[&#39;x&#39;]), int(locations[&#39;y&#39;]), int(locations[&#39;x&#39;] + sizes[&#39;width&#39;]),
     int(locations[&#39;y&#39;] + sizes[&#39;height&#39;]))
Le graphique intercepté est :

Explication détaillée de lexemple dexploration de lindex python3 BaiduL'idée suivante est :

1. Prendre une capture d'écran de tout l'écran

<.>2. Ouvrez la capture d'écran et recadrez-la en utilisant la plage de coordonnées obtenue ci-dessus


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 :

Explication détaillée de lexemple dexploration de lindex python3 Baidu


这个写法最终不太好,最起码要对keyword的长度进行判断,长度过长会导致截图坐标出现偏差,反正我知道怎么做,就是不写出来给你们看!

后面的完整代码是:

# <p class="imgtxt" style="margin-left:-117px;"></p>
imgelement = browser.find_element_by_xpath(&#39;//p[@id="viewbox"]&#39;)
# 找到图片坐标
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 + &#39;zoom.jpg&#39;, &#39;png&#39;, quality=95)

原图大小请 右键->属性->详细信息 查看,我的是长73像素,宽29像素

最后就是图像识别

# 图像识别
index = []
image = Image.open(str(path) + "zoom.jpg")
code = pytesseract.image_to_string(image)
if code:
  index.append(code)

最后效果图:

Explication détaillée de lexemple dexploration de lindex python3 Baidu

Explication détaillée de lexemple dexploration de lindex python3 Baidu


以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持PHP中文网。

更多Explication détaillée de lexemple dexploration de lindex python3 Baidu相关文章请关注PHP中文网!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn