【问题标题】:Create new variables/class instances inside for-loop? Python web scraping在 for 循环中创建新的变量/类实例? Python网页抓取
【发布时间】:2021-06-06 01:01:05
【问题描述】:

我目前正在开发一个网络抓取工具,它将 url 作为输入,找到页面,抓取它,然后以 CSV 格式返回结果。刮板一次适用于单个 URL。但不幸的是,每当它向抓取结果 CSV 写入新行时,它也会在每一列中附加上一个 url 的抓取结果。我需要一个循环,它本质上会在循环内创建新的类变量,这样就不会发生这种情况。类似的事情是这样的:获取 url 列表,然后创建唯一的类实例。

links = ['www.SomeLink1.com','www.Somelink2.com','www.SomeLink3.com']


person1 = Person('www.SomeLink1.com', driver = driver, close_on_complete = False)
person2 = Person('www.Somelink2.com', driver = driver, close_on_complete = False)
person3 = Person('www.SomeLink3.com', driver = driver, close_on_complete = False) 

我无权访问源代码来创建新方法“person1.reset()”之类的。

这也是我用来抓取多个页面的原始代码:

# Import libraries
from linkedin_scraper import Person, actions
from selenium import webdriver
import csv
import os
import pandas as pd
import numpy as np
import smtplib

# Read-in list of contacts:
contacts = pd.read_csv("/Users/Desktop/ContactList.csv")
names = contacts['contact_name'].tolist()
urls = contacts['contact_url'].tolist()
# turn contacts list into dictionary just in case
contact_dict = {names[i]: urls[i] for i in range(len(names))}
print(contact_dict)

# automatically login to LinkedIn
driver = webdriver.Chrome('/Users/Downloads/chromedriver')
email = os.environ.get('LINKEDIN_USER')
password = os.environ.get('LINKEDIN_PASS')
actions.login(driver, email, password)

# create general field names
fields = ['name', 'about', 'job_title', 'location','company',
          'education','accomplishments','linkedin_url']

with open('ScrapeResults.csv', 'w') as f:
    # using csv.writer method from CSV package
    write = csv.writer(f)
    write.writerow(fields)
f.close()

# Loop-through urls to scrape multiple pages at once
for individual,link in contact_dict.items():

    ## assign ##
    the_name = individual
    the_link = link
    # scrape peoples url:
    person = Person(the_link, driver=driver, close_on_complete=False)

    # rows to be written... only index for lists?
    rows = [[person.name, person.about, person.job_title, person.location, person.company,
             person.educations, person.accomplishments, person.linkedin_url]]
    # write
    with open('ScrapeResults.csv', 'a') as f:
    # using csv.writer method from CSV package
        write = csv.writer(f)
        write.writerows(rows)
        f.close()

【问题讨论】:

  • 或者有什么方法可以在这个for循环中重置 person = Person(the_link, driver=driver, close_on_complete=False) 而无需实际编辑包的源代码?
  • 或者,可能是您的rows 变量正在累积以前运行的结果,所以每次您写rows 时,您都在写累积的结果。
  • @RazzleShazl 是的,这正是正在发生的事情。每次 for 循环迭代时,结果都会在类属性中累积/追加。
  • 我认为结果在驱动程序中累积,因此它反过来在rows中产生累积结果。
  • 出于好奇,可以换成close_on_complete=True吗?我不知道它的作用,但似乎这可能有助于重置Person

标签: python loops class object web-scraping


【解决方案1】:

您可以尝试每次都实例化一个新的driver 吗?这应该会为您重置 driver 中的计数器。

for individual,link in contact_dict.items():
    the_name = individual
    the_link = link
    driver = Driver() # I don't know how to instantiate this
    person = Person(the_link, driver=driver, close_on_complete=False).

无法访问驱动程序文档,我无法谈论如何正确实例化它。同样,它甚至可能有一个clear()reset() 内部变量的助手,这比从头重新创建driver 更好。在任何情况下,刮板都应该有相关的简单文档。

【讨论】:

  • 我将创建一个类 Driver() 并尝试在循环的每次迭代中实例化它,如上所示。
  • Driver() 是一个猜测——你能在你的代码中找到 driver 被实例化的地方吗?然后重复使用它。
【解决方案2】:

与“linkedin_scraper”库的创建者取得联系。他修复了一个错误,该错误会缓存以前的linkedin配置文件值/一次抓取多个时累积它们。

问题已在 2.7.5 版中解决。

请看:https://github.com/joeyism/linkedin_scraper/issues/84

谢谢大家!

【讨论】:

  • 奇怪的是我在他们的closed issuesopen issues 中找不到问题。我的意思是 2021 年只有 5 个已关闭的问题和 5 个未解决的问题,没有一个符合这里的描述。
  • 既然如此,如果一个问答格式网站旨在帮助可能有同样问题的未来读者,您能否详细说明您的自我接受的答案并提供更多信息?例如,在哪里跟踪此问题?修复什么时候推出?这个“答案”让读者望而却步。
  • 看看他们的releases,他们的最新版本是 3 月 9 日,也就是您在 3 月 8 日发布此问题的第二天。3 月 9 日的版本是否解决了这个问题?
  • 没错!很抱歉混淆@RazzleShazl ...查看更新的答案!谢谢!
猜你喜欢
  • 2022-01-24
  • 2021-01-07
  • 2021-09-18
  • 2018-04-02
  • 2022-01-01
  • 2020-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多