从scrapy的网站档案中递归地提取URL
您好我想抓取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
我越来越没有结果,可能有人帮助我如何采取为我的网站使用情况或任何其他解决方案的代码跑?
尝试使用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://economictimes.indiatimes.com/archive.cms" on this server.<P>
Reference #18.6057c817.1508411706.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()
这正常运行,你可以清楚地看到它找到正确的网址,个别月份,按打印日志。现在,您可以从此处使用回调(如文档中所述)进一步提出额外请求。
最后,通过阅读文档并理解你正在做的事情,而不是从互联网上拿出一些可疑的代码,并试图将它放到你的问题上,你将会节省很多时间和麻烦。
是否存在对'etUrl()'的调用,传统上由'if __name__ ==“__main__”:etUrl()'类型结构保护? –
它也**非常WEIRD **来安装Scrapy,但随后使用基于'urllib'的请求响应;可以说,Scrapy的50%的力量在于它如何处理整个过程 - 包括有明确的回调,以避免你在那里进行4深刻的缩进 –
我冒昧地整理了你的文章,因为我假设你不是故意在底部递归调用etUrl()... – Iguananaut