Python3のBaiduインデックスクローリング例の詳細説明

高洛峰
リリース: 2017-02-14 13:42:12
オリジナル
2775 人が閲覧しました

この記事では主に python3 Baidu インデックス クローリングを紹介します。編集者はそれを参考として共有します。編集者をフォローして見てみましょう。

Baidu インデックスを取得し、画像認識を使用してインデックスを取得します

前書き:

Tufu は、Taobao では、Baidu インデックスを把握するのが難しいと言ってました:

Python3のBaiduインデックスクローリング例の詳細説明

。お兄さんはとてもかわいいです どうして人々は彼に怯えるのでしょうか、それで完成までに約2日半かかりました、Tufuを軽蔑したいです

インストールされたライブラリがたくさんあります:

谷歌图像识别tesseract-ocr

pip3 install pillow

pip3 install pyocr

selenium2.45

Chrome47.0.2526.106 m or Firebox32.0.1

chromedriver.exe
ログイン後にコピー

にログインする必要があります。 Baidu インデックスにログインします。 アカウントのパスワードはテキストアカウントに書かれています:

Python3のBaiduインデックスクローリング例の詳細説明

ユニバーサルログインコードは次のとおりです:

# 打开浏览器
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):")
ログイン後にコピー

ログインページ:

Python3のBaiduインデックスクローリング例の詳細説明

新しいウィンドウを開く必要があります。つまり、Baidu Index を開いてウィンドウを切り替え、セレンを使用します:

# 新开一个窗口,通过执行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])
ログイン後にコピー

を使用して入力ボックスをクリアし、クリック日数を構築します:

# 清空输入框
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)
ログイン後にコピー

日数はここにあります:

Python3のBaiduインデックスクローリング例の詳細説明

グラフィックボックスを見つけます:

xoyelement = browser.find_elements_by_css_selector("#trend rect")[2]
ログイン後にコピー

グラフィックフレームは次のとおりです:

Python3のBaiduインデックスクローリング例の詳細説明

に従ってオフセットを構築します異なる座標点に:

Python3のBaiduインデックスクローリング例の詳細説明

観察する7日間の座標を選択してください:

最初の点の横座標は1031.66666です

2番目の点の横座標は1234です

Python3のBaiduインデックスクローリング例の詳細説明

の座標7 日は: 202.33 で、他の日も同様です

Selenium ライブラリを使用してマウスのスライド サスペンションをシミュレートします:

from selenium.webdriver.common.action_chains import ActionChains
ActionChains(browser).move_to_element_with_offset(xoyelement,x_0,y_0).perform()
ログイン後にコピー

しかし、明確な点はこの位置です:

Python3のBaiduインデックスクローリング例の詳細説明

、ポップアップ ボックスを表示するためにここでは js がロードされないため、横軸 +1 が必要です:

x_0 = 1
y_0 = 0
ログイン後にコピー

日数に基づいてサイクルを記述し、横軸にします。蓄積:

# 按照选择的天数循环
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
ログイン後にコピー

マウスを水平に動かすとボックスが表示されます: URL でこのボックスを見つけます:

Python3のBaiduインデックスクローリング例の詳細説明

selenium 自動的に認識します...:

# <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;]), int(locations[&#39;y&#39;]), int(locations[&#39;x&#39;] + sizes[&#39;width&#39;]),
     int(locations[&#39;y&#39;] + sizes[&#39;height&#39;]))
ログイン後にコピー

インターセプトされたグラフィックは次のとおりです:

Python3のBaiduインデックスクローリング例の詳細説明

次のアイデアは次のとおりです:

1 . 画面全体のスクリーンショットを撮ります

2.スクリーンショットを開いて、上記で取得した座標範囲を使用して切り抜きます

しかし、最終的な切り抜きは上の黒いフレームです:

Python3のBaiduインデックスクローリング例の詳細説明

それで範囲を計算しますが、私は怠惰なので、その長さを無視します。検索ワードなので激しく直接書きます:

# 构造指数的位置
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;]))
ログイン後にコピー

这个写法最终不太好,最起码要对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")
ログイン後にコピー

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

# 将图片放大一倍
# 原图大小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)
ログイン後にコピー

最后效果图:

Python3のBaiduインデックスクローリング例の詳細説明

Python3のBaiduインデックスクローリング例の詳細説明


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

更多Python3のBaiduインデックスクローリング例の詳細説明相关文章请关注PHP中文网!

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート