2017-10-12 57 views
-4

您好我想抓取http://economictimes.indiatimes.com/archive.cms的數據,所有的網址都是基於日期,月份和年份進行存檔的,首先獲取url列表我使用https://github.com/FraPochetti/StocksProject/blob/master/financeCrawler/financeCrawler/spiders/urlGenerator.py的代碼修改了我的網站作爲代碼,從scrapy的網站檔案中遞歸地提取URL

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 我越來越沒有結果,可能有人幫助我如何採取爲我的網站使用情況或任何其他解決方案的代碼跑?

+0

是否存在對'etUrl()'的調用,傳統上由'if __name__ ==「__main__」:etUrl()'類型結構保護? –

+1

它也**非常WEIRD **來安裝Scrapy,但隨後使用基於'urllib'的請求響應;可以說,Scrapy的50%的力量在於它如何處理整個過程 - 包括有明確的回調,以避免你在那裏進行4深刻的縮進 –

+0

我冒昧地整理了你的文章,因爲我假設你不是故意在底部遞歸調用etUrl()... – Iguananaut

回答

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>)。你也有錯誤的網址格式。相反,像這樣的工作:

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() 

這正常運行,你可以清楚地看到它找到正確的網址,個別月份,按打印日誌。現在,您可以從此處使用回調(如文檔中所述)進一步提出額外請求。

最後,通過閱讀文檔並理解你正在做的事情,而不是從互聯網上拿出一些可疑的代碼,並試圖將它放到你的問題上,你將會節省很多時間和麻煩。