【问题标题】:Extract URLs recursively from website archives in scrapy从scrapy的网站档案中递归提取URL
【发布时间】:2017-10-12 14:14:37
【问题描述】:

您好我想从http://economictimes.indiatimes.com/archive.cms抓取数据,所有的url都是根据日期、月份和年份归档的,首先获取url列表我使用的是https://github.com/FraPochetti/StocksProject/blob/master/financeCrawler/financeCrawler/spiders/urlGenerator.py的代码,修改了我网站的代码作为,

import scrapy
import urllib    
def etUrl():
    totalWeeks = []
    totalPosts = []
    url = 'http://economictimes.indiatimes.com/archive.cms'
    data = urllib.urlopen(url).read()
    hxs = scrapy.Selector(text=data)
    months = hxs.xpath('//ul/li/a').re('http://economictimes.indiatimes.com/archive.cms/\\d+-\\d+/news.cms')
    admittMonths = 12*(2013-2007) + 8
    months = months[:admittMonths]
    for month in months:
        data = urllib.urlopen(month).read()
        hxs = scrapy.Selector(text=data)
        weeks = hxs.xpath('//ul[@class="weeks"]/li/a').re('http://economictimes.indiatimes.com/archive.cms/\\d+-\\d+/news/day\\d+\.cms')
        totalWeeks += weeks
        for week in totalWeeks:
            data = urllib.urlopen(week).read()
            hxs = scrapy.Selector(text=data)
            posts = hxs.xpath('//ul[@class="archive"]/li/h1/a/@href').extract()
            totalPosts += posts
            with open("eturls.txt", "a") as myfile:
                for post in totalPosts:
                    post = post + '\n'
                    myfile.write(post)

etUrl()

将文件保存为urlGenerator.py 并使用命令$ python urlGenerator.py 运行 我没有得到任何结果,有人可以帮助我如何将此代码用于我的网站用例或任何其他解决方案?

【问题讨论】:

  • 是否存在etUrl() 的调用,传统上由if __name__ == "__main__": etUrl() 类型结构保护?
  • 安装 Scrapy 然后使用基于 urllib 的请求响应也是 非常奇怪;可以说,Scrapy 50% 的能力在于它如何处理整个过程——包括定义明确的回调来避免你在那里进行的 4 深缩进
  • 我冒昧地清理了您的帖子,因为我假设您并不是要在底部递归调用etUrl()...
  • 但是,查看您修改的代码,看起来for 循环没有按照您显示的方式嵌套。您发布的代码实际上是您的真实代码吗?在 Python 中,缩进很重要很多,所以请确保您发布的内容符合您实际运行的代码。

标签: python scrapy


【解决方案1】:

尝试使用pdb 一次单步执行您的代码。运行python -m pdb urlGenerator.py 并按照链接页面中的pdb 使用说明进行操作。

如果您逐行浏览代码,您可以立即看到该行

data = urllib.urlopen(url).read()

没有返回有用的东西:

(pdb) print(data)
<HTML><HEAD>
<TITLE>Access Denied</TITLE>
</HEAD><BODY>
<H1>Access Denied</H1>

You don't have permission to access "http&#58;&#47;&#47;economictimes&#46;indiatimes&#46;com&#47;archive&#46;cms" on this server.<P>
Reference&#32;&#35;18&#46;6057c817&#46;1508411706&#46;1c3ffe4
</BODY>
</HTML>

似乎他们不允许 Python 的urllib 访问。正如 cmets 中指出的那样,无论如何你真的不应该使用urllib——Scrapy 已经擅长处理这个问题。

您的许多其他代码显然也被破坏了。例如这一行:

months = hxs.xpath('//ul/li/a').re('http://economictimes.indiatimes.com/archive.cms/\\d+-\\d+/news.cms')

即使给出了来自该站点的真实 HTML,也会返回一个空列表。如果您查看 HTML,它显然是在表格中,而不是未排序的列表 (&lt;ul&gt;)。您也有错误的 URL 格式。相反,这样的事情会起作用:

months = response.xpath('//table//tr//a/@href').re(r'/archive/year-\d+,month-\d+.cms')

如果你想构建一个网络爬虫,而不是从你找到的一些代码(甚至不正确)开始并试图盲目地修改它,尝试遵循official tutorial for Scrapy 并从一些非常简单的开始 示例,然后从那里构建。例如:

class EtSpider(scrapy.Spider):
    name = 'et'
    start_urls = ["https://economictimes.indiatimes.com/archive.cms"]

    def parse(self, response):
        months = response.xpath('//table//tr//a/@href').re(r'/archive/year-\d+,month-\d+.cms')
        for month in months:
            self.logger.info(month)

process = scrapy.crawler.CrawlerProcess()
process.crawl(EtSpider)
process.start()

这运行正常,您可以清楚地看到它为各个月份找到了正确的 URL,并打印到日志中。现在您可以从那里开始使用 callbacks(如文档中所述)来提出进一步的额外请求。

最后,您可以通过阅读文档并了解您在做什么而不是从互联网上获取一些可疑代码并试图将其硬塞到您的问题中,从而为自己节省大量时间和麻烦。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-18
    • 1970-01-01
    • 2012-04-08
    相关资源
    最近更新 更多