Цикл по URL-ссылкам в CSV-файле с помощью Python Selenium - PullRequest
0 голосов
/ 08 июля 2020

У меня есть набор URL-адресов в файле csv, и я хочу oop через эти ссылки и открывать каждую ссылку в CSV по одной. Я получаю несколько разных ошибок в зависимости от того, что я пытаюсь, но, тем не менее, я не могу заставить браузер открывать ссылки. Печать показывает, что ссылки есть.

Когда я запускаю свой код, я получаю следующую ошибку:

Traceback (most recent call last):
  File "/Users/Main/PycharmProjects/ScrapingBot/classpassgiit.py", line 26, in <module>
    open = browser.get(link_loop)
TypeError: Object of type bytes is not JSON serializable 

Может ли кто-нибудь помочь мне с моим кодом ниже, если я чего-то упускаю или если Я делаю это неправильно.

Мой код:

import csv
from selenium import webdriver
from bs4 import BeautifulSoup as soup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait as browser_wait
from selenium.webdriver.support import expected_conditions as EC
import requests

browser = webdriver.Chrome(executable_path=r'./chromedriver')

contents = []

with open('ClassPasslite.csv', 'rt') as cp_csv:
    cp_url = csv.reader(cp_csv)
    for row in cp_url:
        links = row[0]
        contents.append(links)

for link in contents:
    url_html = requests.get(links)

    for link_loop in url_html:

        print(contents)

        open = browser.get(link_loop)

Ответы [ 2 ]

0 голосов
/ 09 июля 2020

Поскольку вы не предоставили какую-либо форму того, что содержится в вашей переменной contents, я предполагаю, что это список строк URL-адресов.

Как упоминалось в @ cap.py, вы напутались, используя requests и selenium одновременно. Когда вы выполняете веб-запрос GET, сервер назначения отправит вам текстовый ответ. Этот текст может быть просто текстом, например Hello world!, или каким-то html. Но этот код html должен интерпретироваться на вашем компьютере, который отправил запрос.

Это точка селен по запросам: запросы возвращают текст, собранный из пункта назначения (URL), в то время как селен запрашивает браузер (например, Chrome), чтобы собрать текст и, если это какой-то текст html, интерпретировать его, чтобы вы получили реальную читаемую веб-страницу. Более того, браузер запускает javascript внутри вашей страницы, поэтому страницы Dynami c также работают.

В конце концов, единственное, что нужно для запуска вашего кода, - это сделать следующее:

import csv
from selenium import webdriver
from bs4 import BeautifulSoup as soup
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait as browser_wait
from selenium.webdriver.support import expected_conditions as EC
import requests

browser = webdriver.Chrome(executable_path=r'./chromedriver')

contents = []

with open('ClassPasslite.csv', 'rt') as cp_csv:
    cp_url = csv.reader(cp_csv)
    for row in cp_url:
        links = row[0]
        contents.append(links)

#link should be something like "https://www.classpass.com/studios/forever-body-coaching-london?search-id=49534025882004019"
for link in contents:
    browser.get(link)
    # paste the code you have here

Совет: не забывайте, что браузерам требуется время для загрузки страниц. Добавление time.sleep(3) вам очень поможет.

0 голосов
/ 09 июля 2020

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

Во второй части вашего кода вы используете requests.get, чтобы получить параметр links (обратите внимание на множественное число), но links, по-видимому, является элементом, который вы определяете в предыдущем разделе (links = row[0]), тогда как link - это фактический объект, который вы определяете в for l oop. Ниже вы можете найти версию кода, которая может быть полезной отправной точкой.

Однако позвольте мне добавить, что одновременное использование requests и selenium в этом случае имеет мало смысла в вашем контексте : зачем получать страницу HTML, а затем l oop поверх ее элементов, чтобы получить другие страницы с selenium?

import csv
import requests

browser = webdriver.Chrome(executable_path=r'./chromedriver')

contents = []

with open('ClassPasslite.csv', 'rt') as cp_csv:
    cp_url = csv.reader(cp_csv)
    for row in cp_url:
        links = row[0]
        contents.append(links)

for link in contents:
    url_html = requests.get(link) # now this is singular

    # Do what you have to do here with requests, in spite of using selenium #
...