Python列表取值问题:YouTube爬虫Tuple存储Twitter链接重复如何解决
问题根源
你使用了全局的twitter_list变量存储链接,该变量不会在每次处理新视频前重置,会持续累加所有视频提取到的Twitter链接;同时列表是Python中的可变对象,存入元组的是列表的内存引用,所有元组条目都会指向同一个全局列表,因此都会显示所有历史抓取的链接。
修复思路
- 移除全局的
twitter_list变量,避免全局状态污染 - 改造
get_links函数,让它直接返回当前视频对应的Twitter链接列表,不操作全局变量 - 每次处理单个视频时,接收
get_links返回的当前视频链接列表,直接存入当前的元组即可
完整修改后代码
from __future__ import unicode_literals import youtube_dl import pandas as pd import csv import re # read the csv file number_of_rows = pd.read_csv('single.csv') # Initialize YouTube-DL Array ydl_opts = {} all_scrapes = [] # 移除全局的twitter_list变量 # Scrape Online Product def run_scraper(): # Read CSV to List with open("single.csv", "r") as f: csv_reader = csv.reader(f) next(csv_reader) # Scrape Data From Store for csv_line_entry in csv_reader: with youtube_dl.YoutubeDL(ydl_opts) as ydl: meta = ydl.extract_info(csv_line_entry[0], download=False) channel = meta['channel'] title = meta['title'] description = meta['description'] print('Channel :', channel) print('Title :', title) # 接收当前视频的twitter链接列表 current_twitter_links = get_links(description) print("-" * 120) print() print('Demo:', current_twitter_links) # 存入当前视频对应的链接列表 current_scrapes = (channel, title, current_twitter_links) all_scrapes.append(current_scrapes) print('All Scrapes:', all_scrapes) print() def get_links(description): # 初始化当前视频的twitter链接列表 twitter_list = [] # Find URLs in description description_urls = re.findall(r'(https?://[^\s]+)', description) # Twitter Resources if 'twitter.com' in description: for item in description_urls: if 'twitter.com' in item: print('- Twitter URL Found:', item) twitter_list.append(item) # 返回当前视频的链接列表 return twitter_list run_scraper()
补充说明
如果不想改造get_links函数,也可以选择在每次循环开始时清空全局twitter_list,但不推荐这种写法,全局变量容易引发意料之外的状态问题。
内容的提问来源于stack exchange,提问作者MarkWP
相关产品推荐
相关产品推荐

