【问题标题】:Scraping URLs with Python and selenium使用 Python 和 selenium 抓取 URL
【发布时间】:2020-01-10 17:42:06
【问题描述】:

我正在尝试让 python selenium 脚本工作,它应该执行以下操作:

  1. 获取文本文件 BookTitle.txt,它是书名列表。

  2. 然后使用 Python/Selenium 在网站 GoodReads.com 中搜索该标题。

  3. 获取结果的 URL 并创建一个新的 .CSV 文件,其中第 1 列=书名,第 2 列=站点 URL

  4. 我希望我们可以让它工作,然后请帮助我一步一步让它运行。

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.common.exceptions import TimeoutException
from selenium.webdriver.firefox.options import Options
from pyvirtualdisplay import Display
#from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common import keys
import csv
import time
import json

class Book:
    def __init__(self, title, url):
        self.title = title
        self.url = url
    def __iter__(self):
        return iter([self.title, self.url])

url = 'https://www.goodreads.com/'

def create_csv_file():
    header = ['Title', 'URL']
    with open('/home/l/gDrive/AudioBookReviews/WebScraping/GoodReadsBooksNew.csv', 'w+', encoding='utf-8') as csv_file:
        wr = csv.writer(csv_file, delimiter=',')
        wr.writerow(header)

def read_from_txt_file():
    lines = [line.rstrip('\n') for line in open('/home/l/gDrive/AudioBookReviews/WebScraping/BookTitles.txt', encoding='utf-8')]
    return lines

def init_selenium():
    chrome_options = Options()
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage') 
    options = Options()
    options.add_argument('--headless')
    global driver
    driver = webdriver.Chrome("/home/l/gDrive/AudioBookReviews/WebScraping/chromedriver",  chrome_options=chrome_options)
    driver.get(url)
    time.sleep(30)
    driver.get('https://www.goodreads.com/search?q=')

def search_for_title(title):
    search_field = driver.find_element_by_xpath('//*[@id="search_query_main"]')
    search_field.clear()
    search_field.send_keys(title)
    search_button = driver.find_element_by_xpath('/html/body/div[2]/div[3]/div[1]/div[1]/div[2]/form/div[1]/input[3]')
    search_button.click()

def scrape_url():
    try:
        url = driver.find_element_by_css_selector('a.bookTitle').get_attribute('href')
    except:
        url = "N/A"

    return url

def write_into_csv_file(vendor):
   with open('/home/l/gDrive/AudioBookReviews/WebScraping/GoodReadsBooksNew.csv', 'a', encoding='utf-8') as csv_file:
        wr = csv.writer(csv_file, delimiter=',')
        wr.writerow(list(vendor))

create_csv_file()
titles = read_from_txt_file()    
init_selenium()

for title in titles:
    search_for_title(title)
    url = scrape_url()
    book = Book(title, url)
    write_into_csv_file(book)

运行上面的,我得到以下错误:

Traceback(最近一次调用最后一次):文件 "/home/l/gDrive/AudioBookReviews/WebScraping/GoodreadsScraper.py", 第 68 行,在 init_selenium() 文件“/home/l/gDrive/AudioBookReviews/WebScraping/GoodreadsScraper.py”, 第 41 行,在 init_selenium driver = webdriver.Chrome("/home/l/gDrive/AudioBookReviews/WebScraping/chromedriver", chrome_options=chrome_options) 文件 "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/chrome/webdriver.py", 第 81 行,在 init 中 desired_capabilities=desired_capabilities)文件“/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py”, 第 157 行,在 init 中 self.start_session(capabilities, browser_profile) 文件“/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py”, 第 252 行,在 start_session 中 response = self.execute(Command.NEW_SESSION,参数)文件“/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/webdriver.py”, 第 321 行,在执行中 self.error_handler.check_response(response) 文件 "/usr/local/lib/python3.6/dist-packages/selenium/webdriver/remote/errorhandler.py", 第 242 行,在 check_response 中 引发异常类(消息,屏幕,堆栈跟踪)selenium.common.exceptions.WebDriverException:消息:未知错误: Chrome 无法启动:异常退出(未知错误: DevToolsActivePort 文件不存在)(进程从 chrome location /usr/bin/google-chrome 不再运行,所以 ChromeDriver 假设 Chrome 已崩溃。)(驱动程序信息: 铬驱动程序=2.44.609551 (5d576e9a44fe4c5b6a07e568f1ebc753f1214634),平台=Linux 4.15.0-60-通用 x86_64)

【问题讨论】:

  • 请检查您的代码并再次复制/粘贴,有一些重复的内容。
  • 谢谢,是的,我已经粘贴了两次,已修复。

标签: python selenium web-scraping selenium-chromedriver


【解决方案1】:

您正在使用 chrome 驱动程序,但您在导入时将其注释掉。

from selenium.webdriver.chrome.options import Options

在搜索功能中,流程为: 获取页面 -> 查找搜索框 -> 输入值 -> 输入键 -> 抓取结果。

类似这样的:

def search_for_title(title):
    driver.get('https://www.goodreads.com/search?q=')
    search_field = driver.find_element_by_name('q')
    search_field.clear()
    search_field.send_keys(title)
    search_field.send_keys(keys.Keys.RETURN) # you missed this part
    url = driver.find_element_by_xpath(
        '/html/body/div[2]/div[3]/div[1]/div[2]/div[2]/table/tbody/tr[1]/td[2]/a')
    print(url.get_attribute('href'))

【讨论】:

  • 太棒了!谢谢,这现在适用于我列表中的第一项,但它停止运行之后,有什么想法吗?
  • @ThelmarGeraldashk 也许是 init_selenium() 中的 sleep(30) ?
【解决方案2】:

我现在可以看到几个错误:

1) 当您稍后在代码中传递 chromedriver 时,您必须取消注释 chrome 选项并注释 firefox'

# from selenium.webdriver.firefox.options import Options
from selenium.webdriver.chrome.options import Options

顺便说一句,pyvirtualdisplay 是 headless chrome 的替代品,您不需要导入它。

2) 你已经实例化了两次 Options 并且你只使用了第一次。将您的代码更改为:

def init_selenium():
    chrome_options = Options()
    chrome_options.add_argument('--no-sandbox')
    chrome_options.add_argument('--disable-dev-shm-usage') 
    chrome_options.add_argument('--headless')

我猜这两个只是开始,当你遇到下一个无法解决的问题时编辑你的问题。

【讨论】:

    猜你喜欢
    • 2014-02-22
    • 1970-01-01
    • 1970-01-01
    • 2021-05-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-09
    • 2021-03-08
    相关资源
    最近更新 更多