使用 Python 和 Scrapy 的 IMDB 抓取工具
IMDB Scraper Using Python and Scrapy
好吧,我是编程新手,我认为最好的学习方法是编写一些东西。我的部分工作涉及在 IMDB 上搜索电影并将导演、编剧、(前四位)演员和 link 粘贴到 Excel 电子表格中的 IMDB 页面。
我的最终目标是获得一个包含电影名称和年份的 CSV,让爬虫从 CSV 中获取这些变量,搜索 IMDB,提取数据,然后将数据导出到一个新的 CSV 中。
我阅读和研究了大约一个星期。我已经成功地完成了 Scrapy 教程,但是我无法从那里到达预期的终点。
如何将 CSV 中的值导入我的爬虫脚本?我认为它看起来像这样:
name = COLUMN1
year = COLUMN2
class imdb_spider(scrapy.Spider):
name = "imdb"
allowed_domains = ["imdb.com"]
start_urls = [
"http://www.imdb.com/find?ref_=nv_sr_fn&q=/(name)&(year)"
]
虽然我不确定如何从 CSV 文件中提取。
- 从那里开始,我需要蜘蛛跟随页面上的第一个 link(这将是电影名称),然后是后续的 "see full cast and crew" link页。
我需要的所有信息都在最后一页:http://www.imdb.com/title/tt0081505/fullcredits?ref_=tt_ov_st_sm
- 定义要提取的内容对我来说真的很费解。
这是我使用 firebug 提取的内容:
导演:
<td class="name">
<a href="/name/nm0000040/?ref_=ttfc_fc_dr1"> Stanley Kubrick </a>
</td>
作者:
<td class="name">
<a href="/name/nm0000040/?ref_=ttfc_fc_wr2"> Stanley Kubrick </a>
</td>
演员(如果可能,只需要前四个):
<td class="itemprop" itemtype="http://schema.org/Person" itemscope="" itemprop="actor">
<td class="ellipsis"> ... </td>
我不确定如何定义页面 link 本身。
之后,我只需要遍历整个列表并用数据保存一个新的 CSV。
我知道这是一个尖锐的问题,我不会要求任何人为我编写代码。如果我知道在哪里 look/how 解决这个问题,我愿意投入工作。我正在阅读Scrapy文档,但仍然不清楚。
如果有明显比 Python 和 Scrapy 更好的方法,请告诉我。
谢谢。
编辑:Mac OS x 10.10.1,Python 2.7,Scrapy 0.24.4,TextWrangler 编辑
csv 模块非常方便,对于包含 irregular/empty 字段的制表符分隔文件也很有用。 (导入 csv)
with open('something_something_darkside.txt', 'rb') as f:
data = list(csv.reader(f,delimiter='\t'))
for row in data:
就网页而言,我找到了使用 Beautiful Soup 将 html 转换为 xml 的方法,并使用 xml 解析器来提取我需要的内容。这些方法可能已经过时但仍然可靠。
好吧,我是编程新手,我认为最好的学习方法是编写一些东西。我的部分工作涉及在 IMDB 上搜索电影并将导演、编剧、(前四位)演员和 link 粘贴到 Excel 电子表格中的 IMDB 页面。
我的最终目标是获得一个包含电影名称和年份的 CSV,让爬虫从 CSV 中获取这些变量,搜索 IMDB,提取数据,然后将数据导出到一个新的 CSV 中。
我阅读和研究了大约一个星期。我已经成功地完成了 Scrapy 教程,但是我无法从那里到达预期的终点。
如何将 CSV 中的值导入我的爬虫脚本?我认为它看起来像这样:
name = COLUMN1 year = COLUMN2 class imdb_spider(scrapy.Spider): name = "imdb" allowed_domains = ["imdb.com"] start_urls = [ "http://www.imdb.com/find?ref_=nv_sr_fn&q=/(name)&(year)" ]
虽然我不确定如何从 CSV 文件中提取。
- 从那里开始,我需要蜘蛛跟随页面上的第一个 link(这将是电影名称),然后是后续的 "see full cast and crew" link页。
我需要的所有信息都在最后一页:http://www.imdb.com/title/tt0081505/fullcredits?ref_=tt_ov_st_sm
- 定义要提取的内容对我来说真的很费解。
这是我使用 firebug 提取的内容:
导演:
<td class="name">
<a href="/name/nm0000040/?ref_=ttfc_fc_dr1"> Stanley Kubrick </a>
</td>
作者:
<td class="name">
<a href="/name/nm0000040/?ref_=ttfc_fc_wr2"> Stanley Kubrick </a>
</td>
演员(如果可能,只需要前四个):
<td class="itemprop" itemtype="http://schema.org/Person" itemscope="" itemprop="actor">
<td class="ellipsis"> ... </td>
我不确定如何定义页面 link 本身。
之后,我只需要遍历整个列表并用数据保存一个新的 CSV。
我知道这是一个尖锐的问题,我不会要求任何人为我编写代码。如果我知道在哪里 look/how 解决这个问题,我愿意投入工作。我正在阅读Scrapy文档,但仍然不清楚。
如果有明显比 Python 和 Scrapy 更好的方法,请告诉我。
谢谢。
编辑:Mac OS x 10.10.1,Python 2.7,Scrapy 0.24.4,TextWrangler 编辑
csv 模块非常方便,对于包含 irregular/empty 字段的制表符分隔文件也很有用。 (导入 csv)
with open('something_something_darkside.txt', 'rb') as f:
data = list(csv.reader(f,delimiter='\t'))
for row in data:
就网页而言,我找到了使用 Beautiful Soup 将 html 转换为 xml 的方法,并使用 xml 解析器来提取我需要的内容。这些方法可能已经过时但仍然可靠。