Автоматически собирать несколько вопросов из quora с определенным тегом?

Я хочу собрать вопросы из Quora, связанные с какой-то конкретной темой, на которую есть более 4 ответов или около того.

Я хочу найти

а) Количество ответов

б) теги, связанные с каждым вопросом

Это моя программа:

res=requests.get("https://www.quora.com/How-does-Quora-automatically-know-what-tags-to-put-for-a-question")

soup=BeautifulSoup(res.text, 'lxml')
# All the ans inside pagedlist_item
ans=soup.find_all('div', {'class' : 'pagedlist_item'})


#Question Name inside question_text_edit
qname=soup.find('div', {'class' : 'question_text_edit'})
#qnam=soup.find('div', {'class' : 'question_text_edit'})


#Tag of Question
tags=soup.find('div', {'class' : 'QuestionTopicHorizontalList TopicList'})



#checking to see if "TV" is the tag of the question in the current webpage 
#Also, checking if no. of answers of the given question >=4, if yes then print the question
#logic for checking the conditions
no_ans=0;
if "TV" in tags.text:
    print(i.text)
    for a in ans:
        no_ans=no_ans+1
    if no_ans>=4:
        print(qname.text)

Я хочу выполнить поиск по многим таким страницам с тегом TV, а затем выполнить проверку этих страниц, чтобы удовлетворить вышеуказанному условию.

Логика проверки условий присутствует в конце кода. Но это будет работать только для одного вопроса на веб-странице, адрес которой находится внутри функции requests.get("").

Как я могу позволить коду автоматически перебирать многие веб-страницы (несколько вопросов) с тегом «ТВ», а не передавать адрес одной веб-страницы в функцию requests.get("")?

Кроме того, я хочу очистить несколько вопросов (до 40 или около того).


person ajaysinghnegi    schedule 18.12.2018    source источник
comment
Начните с просмотра curl   -  person Sembei Norimaki    schedule 18.12.2018
comment
@SembeiNorimaki Не можешь BeautifulSoup помочь мне в этом?   -  person ajaysinghnegi    schedule 18.12.2018
comment
Да, вы также можете начать смотреть на BeautifulSoup   -  person Sembei Norimaki    schedule 18.12.2018
comment
@SembeiNorimaki Я надеюсь, что вопрос теперь хорошо определен !! Я не могу задавать новые вопросы с таким количеством downvotes даже после EDIT !!   -  person ajaysinghnegi    schedule 21.12.2018
comment
То, как этот вопрос читается сейчас, звучит так: «У меня есть код, который решает часть проблемы; Можете ли вы, ребята, предоставить остальную часть кода, чтобы решить всю мою проблему бесплатно?». Это, вероятно, объясняет отрицательные голоса. Никто не хочет, чтобы с ним обращались как с бесплатной службой написания кода! Это может быть объяснено и тем, что «решение» кажется тривиальным и должно было прийти вам в голову: чтобы найти список страниц по телевизору, вы должны сначала узнать, как вы, человек, нашли бы этот список «обычно», по навигации по сайту с помощью вашего браузера. Затем напишите код для автоматизации этого. Это «взгляните на BeautfulSoup»   -  person Dan Bron    schedule 22.12.2018
comment
@DanBron Хорошо!! Я никогда не просил код. Я только хочу, чтобы подход делал то, что мне нужно. Отдых сделаю.   -  person ajaysinghnegi    schedule 23.12.2018
comment
@AjaySinghNegi Подход таков, как я его описал: узнайте, что вы, человек, сделали бы вручную, чтобы получить список всех этих страниц, а затем автоматизируйте процесс создания этого списка. Например, если вы, как человек, должны щелкнуть тег [TV] в статье Quora, чтобы получить список всех вопросов Quora о телевидении, то теперь вы знаете, что вам нужно создать бота, который будет щелкать этот тег для вас. . Мне это кажется достаточно простым, и я не знаю, чего не хватает, о чем вы просите здесь помощи. Что бы вы как человек ни сделали, чтобы сделать это вручную, автоматизируйте это.   -  person Dan Bron    schedule 23.12.2018
comment
Понял тебя. Вы имеете в виду систему автоматизации, которая может автоматически делать то, что сделал бы человек? Не могли бы вы помочь мне узнать структуру, которая мне понадобится для этого?   -  person ajaysinghnegi    schedule 23.12.2018
comment
@AjaySinghNegi Вам не нужен фреймворк. Просто напишите код. Ничего особенного в этой проблеме нет. Это повседневное программирование. Это в основном то, что делают программы, для чего они написаны в первую очередь: автоматизировать задачи, которые в противном случае пришлось бы выполнять людям.   -  person Dan Bron    schedule 23.12.2018
comment
@DanBron Сэр, спасибо за помощь. Я надеюсь, что ответ на этот вопрос теперь поможет мне удалить сообщение «Вы достигли лимита вопросов».   -  person ajaysinghnegi    schedule 25.12.2018


Ответы (1)


Отвечу поэтапно:

I want to search over many such pages which have the tag TV and then later perform the check over those pages to satisfy the above condition.

Что ж, если вы хотите очистить несколько страниц, подобных этим, вам нужно начать с корневой страницы темы, которая содержит много вопросов, связанных с этой конкретной темой, и начать очистку ссылок этих вопросов, перечисленных на этой корневой странице.

Also, I want to scrape multiple questions(as many as 40 or so)

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

Вы не можете напрямую использовать Requests, BeautifulSoup для выполнения событий, таких как имитация операции прокрутки. Вот фрагмент кода, который у меня есть на Python, использующий библиотеку Selenium для выполнения ваших требований.

Примечание.

  1. Установите драйвер Chrome для вашей версии Chrome.

  2. установить селен с помощью pip install -U selenium.

  3. Если вы используете Windows - executable_path='/path/to/chromedriver.exe'

Этот код запрашивает 2 ссылки, а затем начинает очищать «Вопрос, количество ответов, теги, 4 ответа» и сохраняет их в формате csv.

Keys.PAGE_DOWN используется для имитации кнопки прокрутки. К списку row добавляются различные детали, и в конце он сохраняется в файл csv.

Кроме того, вы можете изменить значение переменной no_of_pagedowns, чтобы увеличить число. из свитков, которые вы хотите.

import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import csv


with open('submission.csv','w') as file:
    file.write("Question,No. of answers,Tags,4 answers")

link1 = input("Enter first link")
#link2 = input("Enter second link")
manylinks = list()
manylinks.append(link1)
#manylinks.append(link2)
for olink in manylinks:
    qlinks = list()    
    browser = webdriver.Chrome(executable_path='/Users/ajay/Downloads/chromedriver')
    browser.get(olink)
    time.sleep(1)
    elem = browser.find_element_by_tag_name("body")


    no_of_pagedowns = 50
    while no_of_pagedowns:
        elem.send_keys(Keys.PAGE_DOWN)
        time.sleep(0.2)
        no_of_pagedowns-=1
    post_elems =browser.find_elements_by_xpath("//a[@class='question_link']")
    for post in post_elems:
        qlink = post.get_attribute("href")
        print(qlink)
        qlinks.append(qlink)

    for qlink in qlinks:

        append_status=0

        row = list()

        browser.get(qlink)
        time.sleep(1)


        elem = browser.find_element_by_tag_name("body")


        no_of_pagedowns = 1
        while no_of_pagedowns:
            elem.send_keys(Keys.PAGE_DOWN)
            time.sleep(0.2)
            no_of_pagedowns-=1


        #Question Names
        qname =browser.find_elements_by_xpath("//div[@class='question_text_edit']")
        for q in qname:
            print(q.text)
            row.append(q.text)


        #Answer Count    
        no_ans = browser.find_elements_by_xpath("//div[@class='answer_count']")
    #    print("No. of ans :")
        for count in no_ans:
    #        print(count.text)
            append_status = int(count.text[:2])

            row.append(count.text)

        #Tags
        tags = browser.find_elements_by_xpath("//div[@class='header']")
    #    print("\nTag :")
        tag_field = list()
        for t in tags:
            tag_field.append(t.text)
    #        print(t.text,'\n')
        row.append(tag_field)


        #All answers
        all_ans=browser.find_elements_by_xpath("//div[@class='ui_qtext_expanded']")
        i=1
        answer_field = list()
        for post in all_ans:
            if i<=4:
                i=i+1
    #            print("Answer : ")
    #            print(post.text)
                answer_field.append(post.text)
            else:
                break   
        row.append(answer_field)


        print('append_status',append_status)

        if append_status >= 4:
            with open('submission.csv','a') as file:
                writer = csv.writer(file)
                writer.writerow(row)
person ajaysinghnegi    schedule 25.12.2018