0

我正在尝试创建一个网络爬虫。我目前只是在 Youtube 上测试它,但我打算在以后扩展它以做更多事情。目前,我还在学习。

目前我正在尝试将信息导出到 csv,下面的代码是我目前所拥有的,当我运行它来提取标题描述时,它似乎工作得很好。但是,当我添加代码以获取“视图”和“喜欢”时,它会弄乱输出文件,因为它们中有逗号。

有谁知道我能做些什么来解决这个问题?

import urllib2
import __builtin__
from selenium import webdriver
from selenium.common.exceptions import NoSuchAttributeException
from selenium.common.exceptions import NoSuchElementException
from selenium.webdriver.common.keys import Keys
import time
from time import sleep
from random import randint
from lxml import etree

browser = webdriver.Firefox()
time.sleep(2)
browser.get("https://www.youtube.com/results?search_query=funny")
time.sleep(2)
browser.find_element_by_xpath("//*[@id='section-list']/li/ol/li[1]/div/div/div[2]/h3/a").click()
time.sleep(2)
url = browser.current_url
title = browser.find_element_by_xpath("//*[@id='eow-title']").text
views = browser.find_element_by_xpath("//*[@id='watch7-views-info']/div[1]").text
likes = browser.find_element_by_xpath("//*[@id='watch-like']/span").text
dislikes = browser.find_element_by_xpath("//*[@id='watch-dislike']/span").text
tf = 'textfile.csv'
f2 = open(tf, 'a+')
f2.write(', '.join([data.encode('utf-8') for data in [url]]) + ',')
f2.write(', '.join([data.encode('utf-8') for data in [title]]) + ',')
f2.write(', '.join([data.encode('utf-8') for data in [views]]) + ',')
f2.write(', '.join([data.encode('utf-8') for data in [likes]]) + ',')
f2.write(', '.join([data.encode('utf-8') for data in [dislikes]]) + '\n')
f2.close()
4

2 回答 2

1

首先,您使用逗号而不是点看到这些数字的事实取决于 youtube 为您的浏览器检测到的语言和区域设置。

一旦你有了views,likesdislikes字符串,你可以执行如下操作来去掉逗号:

likes = "3,141,592"
likes = likes.replace(',', '')  # likes is now: "3141592"
likes = int(likes)  # likes is now an actual integer, not just a string

这是有效的,因为这 3 个参数都是整数,因此您不必开始考虑对于指示非整数部分的开头实际上很重要的逗号或点。

最后,关于如何使用 csv 模块的好例子在互联网上随处可见。我可以推荐来自Python Module of the Week 的那个。如果您理解这些示例,您将能够更改您的代码以使用这个高效的模块。

于 2014-12-01T13:43:24.197 回答
0

您无需自己编写原始 csv 格式。使用https://docs.python.org/2/library/csv.html

示例代码:

stringio = StringIO.StringIO()
csv_writer = csv.writer(stringio)
csv_writer.writerow([data.encode('utf-8') for data in [url]])
csv_writer.writerow([data.encode('utf-8') for data in [title]])
csv_writer.writerow([data.encode('utf-8') for data in [views]])
csv_writer.writerow([data.encode('utf-8') for data in [likes]])
csv_writer.writerow([data.encode('utf-8') for data in [dislikes]])
with open('textfile.csv') as fp:
  fp.write(stringio.getvalue())

我无法理解[data.encode('utf-8') for data in [url]]或您的意思是:

csv_writer.writerow([data.encode('utf-8') for data in [url, title, views, likes, dislikes]])

您也可以尝试csv.writer(open('textfile.csv', 'a+'))不写入字符串缓冲区。

于 2014-12-01T14:37:55.510 回答