Heim > Backend-Entwicklung > Python-Tutorial > Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

高洛峰
Freigeben: 2017-02-14 13:42:12
Original
2784 Leute haben es durchsucht

Dieser Artikel stellt hauptsächlich das Crawlen von Python3-Baidu-Indizes vor. Jetzt werde ich es mit Ihnen teilen und als Referenz geben. Folgen wir dem Herausgeber, um einen Blick darauf zu werfen.

Erfassen Sie den Baidu-Index und verwenden Sie dann die Bilderkennung, um den Index zu erhalten

Vorwort:

Tufu sagte einmal, dass der Baidu-Index schwer zu verstehen sei und 20 kostet Yuan pro Artikel auf Taobao Schlüsselwörter:

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

Wie könnte jemand Angst vor ihm haben, also habe ich ungefähr zweieinhalb Tage damit verbracht, es fertigzustellen. Ich verachte Tufu

Es gibt viele installierte Bibliotheken:

谷歌图像识别tesseract-ocr

pip3 install pillow

pip3 install pyocr

selenium2.45

Chrome47.0.2526.106 m or Firebox32.0.1

chromedriver.exe
Nach dem Login kopieren

Sie müssen sich anmelden, um den Baidu-Index aufzurufen. Das Anmeldekonto und das Passwort werden in den Text „Konto“ geschrieben:

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

Der universelle Anmeldecode lautet wie folgt:

# 打开浏览器
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):")
Nach dem Login kopieren

Anmelden Seite:

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

Nach dem Anmelden müssen Sie ein neues Fenster öffnen, dh den Baidu-Index öffnen und das Fenster wechseln:

# 新开一个窗口,通过执行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])
Nach dem Login kopieren

Leeren Sie das Eingabefeld und erstellen Sie die Anzahl der Klicktage:

# 清空输入框
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)
Nach dem Login kopieren

Die Anzahl der Tage ist hier:

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

Suchen Sie das Grafikfeld:

xoyelement = browser.find_elements_by_css_selector("#trend rect")[2]
Nach dem Login kopieren

Das Grafikfeld ist:

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

Konstruieren Sie Offsets basierend auf verschiedenen Koordinatenpunkten:

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

Wählen Sie die Koordinaten von 7 Tagen. Betrachten wir:

Die Abszisse des ersten Punktes ist 1031,66666

Die Abszisse des zweiten Punktes ist 1234

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

Der Unterschied zwischen den beiden Koordinaten für 7 Tage beträgt also: 202,33, und die anderen Tage sind ähnlich

Verwenden Sie die Selenium-Bibliothek, um die gleitende Aufhängung der Maus zu simulieren :

from selenium.webdriver.common.action_chains import ActionChains
ActionChains(browser).move_to_element_with_offset(xoyelement,x_0,y_0).perform()
Nach dem Login kopieren

Aber der definitive Punkt liegt an dieser Position:

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

Das heißt, in der oberen linken Ecke des Rechtecks, die hier nicht geladen wird, zeigt js ein Popup-Fenster an. Fügen Sie also 1 zur Abszisse hinzu:

x_0 = 1
y_0 = 0
Nach dem Login kopieren

Schreiben Sie eine Schleife basierend auf der Anzahl der Tage und lassen Sie die Abszisse akkumulieren:

# 按照选择的天数循环
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
Nach dem Login kopieren

Eine Box wird erscheint, wenn Sie die Maus horizontal bewegen. Finden Sie dieses Feld in der URL:

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

Selenium erkennt automatisch...:

# <p class="imgtxt" style="margin-left:-117px;"></p>
imgelement = browser.find_element_by_xpath(&#39;//p[@id="viewbox"]&#39;)
Nach dem Login kopieren

und bestimmt die Größe und Position dieser Box:

# 找到图片坐标
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;]))
Nach dem Login kopieren

Die Die abgefangene Grafik lautet:

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

Die folgende Idee ist:

1 Machen Sie einen Screenshot des gesamten Bildschirms

2. Öffnen Sie den Screenshot und beschneiden Sie ihn mit dem oben erhaltenen Koordinatenbereich

Der endgültige Zuschnitt ist jedoch das schwarze Feld oben. Der gewünschte Effekt ist:

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

Also ich muss die Reichweite berechnen, aber ich bin faul und ignoriere die Länge des Suchbegriffs, also schreibe ich es direkt heftig:

# 构造指数的位置
rangle = (int(locations[&#39;x&#39;] + sizes[&#39;width&#39;]/3), int(locations[&#39;y&#39;] + sizes[&#39;height&#39;]/2), int(locations[&#39;x&#39;] + sizes[&#39;width&#39;]*2/3),
     int(locations[&#39;y&#39;] + sizes[&#39;height&#39;]))
Nach dem Login kopieren

这个写法最终不太好,最起码要对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[&#39;x&#39;] + sizes[&#39;width&#39;]/3), int(locations[&#39;y&#39;] + sizes[&#39;height&#39;]/2), int(locations[&#39;x&#39;] + sizes[&#39;width&#39;]*2/3),
     int(locations[&#39;y&#39;] + sizes[&#39;height&#39;]))
# 截取当前浏览器
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")
Nach dem Login kopieren

但是后面发现裁剪的图片太小,识别精度太低,所以需要对图片进行扩大:

# 将图片放大一倍
# 原图大小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)
Nach dem Login kopieren

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

最后就是图像识别

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

最后效果图:

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index

Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index


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

更多Detaillierte Erläuterung des Beispiels für das Crawlen des Python3-Baidu-Index相关文章请关注PHP中文网!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage