Как очистить все содержимое с сайта с бесконечной прокруткой? скрап

Я использую scrapy.

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

на сайте много сообщений, но я отскребал только 13.

Как очистить остальные посты?

вот мой код:

class exampleSpider(scrapy.Spider):
name = "example"
#from_date = datetime.date.today() - datetime.timedelta(6*365/12)
allowed_domains = ["example.com"]
start_urls = [
    "http://www.example.com/somethinghere/"
]

def parse(self, response):
  for href in response.xpath("//*[@id='page-wrap']/div/div/div/section[2]/div/div/div/div[3]/ul/li/div/h1/a/@href"):
    url = response.urljoin(href.extract())
    yield scrapy.Request(url, callback=self.parse_dir_contents)


def parse_dir_contents(self, response):
    #scrape contents code here

person Michimcchicken    schedule 13.05.2016    source источник


Ответы (6)


Проверьте код сайта.

Если бесконечная прокрутка автоматически запускает действие js, вы можете поступить следующим образом, используя предложение Алиота: вертушка

Следуя docs, вы можете найти, что может запускать события jquery.

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

Попробуйте создать событие scroll to bottom или создать изменение свойства css для любого из div внутри прокручиваемого содержимого на веб-сайте. После spynner docs, что-то вроде:

browser = spynner.Browser(debug_level=spynner.DEBUG, debug_stream=debug_stream)
# load here your website as spynner allows
browser.load_jquery(True)
ret = run_debug(browser.runjs,'window.scrollTo(0, document.body.scrollHeight);console.log(''scrolling...);')
# continue parsing ret 

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

br.load('http://pypi.python.org/pypi')

anchors = br.webframe.findAllElements('#menu ul.level-two a')
# chooses an anchor with Browse word as key
anchor = [a for a in anchors if 'Browse' in a.toPlainText()][0]
br.wk_click_element_link(anchor, timeout=10)
output = br.show()
# save output in file: output.html or 
# plug this actions into your scrapy method and parse output var as you do 
# with response body

Затем запустите scrapy для файла output.html или, если вы его реализовали, используя переменную локальной памяти, которую вы выбрали для хранения измененного html после действия js.

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

Попробуйте отобразить веб-сайт в браузере с отключенным javascript, и, возможно, таким образом веб-сайт сделает доступную ссылку привязки в конце раздела содержимого.

Также есть успешные реализации навигации сканера js с использованием подхода с Scrapy вместе с Selenium, подробно описанного в this так ответь.

person Evhz    schedule 14.04.2017
comment
Спасибо за прекрасный ответ. ♥ - person Ali Hesari; 15.04.2017

Я использую Selenium, а не scrapy, но вы должны уметь делать то же самое, и что я делаю, так это запускаю некоторый JavaScript при загрузке файла, а именно:

driver.execute_script("window.scrollTo(0, document.body.scrollHeight);")

И я продолжаю делать это, пока он не перестанет прокручиваться. Это некрасиво и не может использоваться в производстве, но эффективно для конкретных работ.

person HenryM    schedule 12.04.2017
comment
Будет ли использование Scrapy также запускать JavaScript? - person Ali Hesari; 13.04.2017

Я думаю, что вы ищете логику разбиения на страницы наряду с вашей нормальной логикой

В большинстве случаев .. бесконечная прокрутка == перелистывание, на такой странице, когда вы прокручиваете вниз до 3/4 страницы или до конца страницы, страница запускает вызов AJAX и загружает содержимое следующей страницы и загрузить ответ на текущую страницу

Я бы рекомендовал использовать инструмент network monitor в firefox и замечать любой такой запрос страницы при прокрутке вниз

- подсказка: вы будете использовать scrapy.FormRequest или scrapy.FormRequest.from_response при реализации этого решения.

person MrPandav    schedule 14.05.2016

Я думаю, вы ищете что-то вроде DEPTH-LIMIT

http://doc.scrapy.org/en/latest/topics/settings.html#depth-limit

http://bgrva.github.io/blog/2014/03/04/scrapy-after-tutorials-part-1/

person WannaBeCoder    schedule 13.05.2016
comment
Я попытался установить ограничение глубины в своих настройках, но все равно не могу войти .. он застрял на получении всех этих ссылок: www.example.com/blog/2016/05/13, но он не щелкнул ссылку и не очистил ее .. - person Michimcchicken; 13.05.2016
comment
Извините, я не мог понять, где он застрял. Вы можете проверить некоторые примеры в Интернете, например github.com/scrapy/ dirbot / blob / master / dirbot / spiders / dmoz.py - person WannaBeCoder; 13.05.2016
comment
Ограничение глубины - переход ко всем имеющимся ссылкам. Допустим, страница, на которой вы находитесь, является первым уровнем, и если вы нажмете на нее ссылку. Это будет уровень 1 и продолжается ... Это ГЛУБИНА-ПРЕДЕЛ, используемая не для бесконечной прокрутки ... - person Sanjay Poongunran; 10.05.2018

Очевидно, этот целевой сайт загружает свое содержание динамически. Следовательно, есть два подходящих решения:

  1. Расшифруйте взаимодействие jQuery в тонкостях и попробуйте смоделировать обмен данными с сервером вручную

  2. Используйте другой инструмент для этой конкретной работы. Например, spynner мне кажется правильным выбором, чтобы обратить внимание.

person Alioth    schedule 12.04.2017

В некоторых случаях вы можете найти в исходном коде элемент, вызываемый для запуска «следующей» разбивки на страницы, даже при бесконечной прокрутке. Поэтому вам просто нужно щелкнуть этот элемент, и он покажет остальные сообщения. Со скрапией / селеном:

next = self.driver.find_element_by_xpath('//a[@class="nextResults"]')
next.click()
time.sleep(2) 
person driperdk    schedule 28.06.2018