在scrapy中从网站档案中递归提取URL

时间:2017-10-12 14:14:38

标签: python scrapy

您好我想从http://economictimes.indiatimes.com/archive.cms抓取数据,所有网址都根据日期,月份和年份进行归档,首先获取我使用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运行 我没有得到任何结果,是否可以有人协助我如何为我的网站用例或任何其他解决方案采用此代码?

1 个答案:

答案 0 :(得分:0)

尝试使用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访问。正如评论中指出的那样,你真的不应该使用urllib - Scrapy已经擅长处理这个问题了。

很多代码的其余部分也明显被破坏了。例如,这一行:

months = hxs.xpath('//ul/li/a').re('http://economictimes.indiatimes.com/archive.cms/\\d+-\\d+/news.cms')
即使从这个站点获得真实的HTML,

也会返回一个空列表。如果你看一下HTML显然是在表格中,而不是未排序的列表(<ul>)。您还有错误的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()

这样运行正常,您可以清楚地看到它找到了打印到日志中的各个月的正确网址。现在您可以从那里开始使用回调,如文档中所述,以进一步提出其他请求。

最后,通过阅读文档并了解自己正在做的事情而不是从互联网上删除一些可疑代码并试图将其置于问题中,您将节省大量时间和麻烦。 / p>