Использование Mechanize Bing Search возвращает пустую страницу

Я использую Mechanize, чтобы выполнить поиск Bing, а затем обработаю результаты красивым супом. Я успешно выполнил поиск в google и yahoo с помощью этого же метода, но когда я выполняю поиск bing, все, что я получаю, - это пустая страница.

Я полностью сбит с толку, почему это так, и если кто-нибудь может пролить свет на этот вопрос, это было бы очень полезно. Вот пример кода, который я использую:

from BeautifulSoup import BeautifulSoup
import mechanize
br = mechanize.Browser()
br.set_handle_robots(False)
br.open("http://www.bing.com/search?count=100&q=cheese")
content = br.response()
content = content.read()
soup = BeautifulSoup(content, convertEntities=BeautifulSoup.ALL_ENTITIES)
print soup

В результате печатается пустая строка.


person Quantra    schedule 19.11.2010    source источник


Ответы (2)


Вероятно, вы получили ответ, что ответ уже находится в кеше вашего браузера. Попробуйте немного изменить строку запроса, например уменьшить количество до 50.

Вы также можете добавить отладочный код и увидеть заголовки, возвращаемые сервером:

br.open("http://www.bing.com/search?count=50&q=cheese")
response = br.response()
headers = response.info()
print headers
content = response.read()

РЕДАКТИРОВАТЬ:

Я пробовал этот запрос с count=100 в браузерах Firefox и Opera, и похоже, что bing не любит такой "большой" счетчик. Когда я уменьшаю счет, это работает. Так что это не ошибка механизации или другой библиотеки Python, но ваш запрос проблематичен для bing. Также кажется, что браузер может запрашивать bing с count=100, но сначала он должен запросить bing с меньшим количеством. Странный!

person Michał Niklas    schedule 19.11.2010
comment
Спасибо за понимание. Я повторил поиск, изменив счетчик до 50, и это сработало, как и ожидалось, много раз. Я снова изменил счетчик на 100, и он снова не работал ... Странно. Также я выполнил отладку, которую вы предложили, вот результат для count = 100 Cache-Control: no-cache Content-Length: 0 Дата: Пт, 19 ноября 2010 12:42:00 GMT Соединение: закрыть Set-Cookie: OVR = flt = 0 & flt2 = 0 & flt3 = 0 & flt4 = 0 & flt5 = 0 & ramp1 = 0 & release = or3 & preallocation = 0 & R = 1; домен = .bing.com; путь = / - person Quantra; 19.11.2010
comment
Отредактировал ответ: этот запрос не работает в обычных браузерах! По крайней мере, впервые. Действительно странно, - person Michał Niklas; 20.11.2010

Другой способ добиться этого - использовать requests с beautifulsoup

Код и пример в онлайн-среде IDE:

from bs4 import BeautifulSoup
import requests, lxml, json

headers = {
    'User-agent':
    "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.102 Safari/537.36 Edge/18.19582"
}


def get_organic_results():
  html = requests.get('https://www.bing.com/search?q=nfs', headers=headers)
  soup = BeautifulSoup(html.text, 'lxml')

  bing_data = []

  for result in soup.find_all('li', class_='b_algo'):
    title = result.h2.text
    try:
      link = result.h2.a['href']
    except:
      link = None
    displayed_link = result.find('div', class_='b_attribution').text
    try:
      snippet = result.find('div', class_='b_caption').p.text
    except:
      snippet = None

    for inline in soup.find_all('div', class_='b_factrow'):
      try:
        inline_title = inline.a.text
      except:
        inline_title = None
      try:
        inline_link = inline.a['href']
      except:
        inline_link = None

        bing_data.append({
        'title': title,
        'link': link,
        'displayed_link': displayed_link,
        'snippet': snippet,
        'inline': [{'title': inline_title, 'link': inline_link}]
      })

  print(json.dumps(bing_data, indent = 2))

# part of the created json output:
'''
[
  {
    "title": "Need for Speed Video Games - Official EA Site",
    "link": "https://www.ea.com/games/need-for-speed",
    "displayed_link": "https://www.ea.com/games/need-for-speed",
    "snippet": "Need for Speed Forums Buy Now All Games Forums Buy Now Learn More Buy Now Hit the gas and tear up the roads in this legendary action-driving series. Push your supercar to its limits and leave the competition in your rearview or shake off a full-scale police pursuit \u2013 it\u2019s all just a key-turn away.",
    "inline": [
      {
        "title": null,
        "link": null
      }
    ]
  }
]
'''

Кроме того, вы можете сделать то же самое с помощью Bing Organic Results API от SerpApi. Это платный API с бесплатной пробной версией 5000 поисковых запросов.

Код для интеграции:

from serpapi import GoogleSearch
import os

def get_organic_results():
  params = {
    "api_key": os.getenv('API_KEY'),
    "engine": "bing",
    "q": "nfs most wanted"
  }

  search = GoogleSearch(params)
  results = search.get_dict()

  for result in results['organic_results']:
    title = result['title']
    link = result['link']
    displayed_link = result['displayed_link']
    try:
      snippet = result['snippet']
    except:
      snippet = None
    try:
      inline = result['sitelinks']['inline']
    except:
      inline = None
    print(f'{title}\n{link}\n{displayed_link}\n{snippet}\n{inline}\n')

# part of the output:
'''
Need for Speed: Most Wanted - Car Racing Game - Official ...
https://www.ea.com/games/need-for-speed/need-for-speed-most-wanted
https://www.ea.com/games/need-for-speed/need-for-speed-most-wanted
Jun 01, 2017 · To be Most Wanted, you’ll need to outrun the cops, outdrive your friends, and outsmart your rivals. With a relentless police force gunning to take you down, you’ll need to make split-second decisions. Use the open world to …
[{'title': 'Need for Speed No Limits', 'link': 'https://www.ea.com/games/need-for-speed/need-for-speed-no-limits'}, {'title': 'Buy Now', 'link': 'https://www.ea.com/games/need-for-speed/need-for-speed-heat/buy'}, {'title': 'Need for Speed Undercover', 'link': 'https://www.ea.com/games/need-for-speed/need-for-speed-undercover'}, {'title': 'Need for Speed The Run', 'link': 'https://www.ea.com/games/need-for-speed/need-for-speed-the-run'}, {'title': 'News', 'link': 'https://www.ea.com/games/need-for-speed/need-for-speed-payback/news'}]
'''

Отказ от ответственности, я работаю на SerpApi.

person Dimitry Zub    schedule 17.06.2021