在Scrapy爬虫(一)——你的第一个Scrapy爬虫中我们写了一个最简易的爬虫,可是这个爬虫并没有实现保存页面内容的功能。
本篇主要会通过pipLine实现页面内容保存以及代理访问的功能。
在每次调用parse()函数都通过yield语句返回一个list,而实际上我们可以自定义一个Item类通过这个函数返回一个Item List。
首先,我们要在新建一个item.py并且自定义一个Item:
class CollectItem(scrapy.Item):
news_id=scrapy.Field()
language=scrapy.Field()
request_url=scrapy.Field()
title=scrapy.Field()
classification=scrapy.Field()
body=scrapy.Field()
这个类要继承于scrapy.Item,里面每个自定义的变量都要等于scrapy.Field()才能发挥作用。而后在parse()中方法中要这样定义:
item['news_id'] = self.cot
item['language'] = 'ind'
item['classification'] = response.xpath("//a[@class='label label-primary']/text()").extract()
而后我们自定义的item就会传到pipline.py中的process_item这个方法里面
项目管道(Item Pipeline),负责处理有蜘蛛从网页中抽取的项目,他的主要任务是清晰、验证和存储数据。当页面被蜘蛛解析后,将被发送到项目管道,并经过几个特定的次序处理数据。
具体定义如下:
class LearnscrapyPipeline(object):
def process_item(self, item, spider):
filename="/home/lhn/Desktop/json/"+str(item['news_id'])+".json"
with open(filename,"wb")as f:
f.write('\"news_id\":'+str(item['news_id'])+'\n')
f.write('\"pub_time\":'+''.join(item['pub_time'])+'\n')
return item
最后要在setting.py中添加
# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'learnScrapy.pipelines.LearnscrapyPipeline': 300,
}
下载保存页面内容如此便实现了。
当我们爬取一些网站的时候可能需要用到代理服务器,而代理的功能主要是用自定义的DownloadMiddware来实现的。
我们新建一个proxymiddware.py文件
class ProxyMiddleware(object):
proxyList = [ \
'127.0.0.1:393'
]
def process_request(self, request, spider):
# Set the location of the proxy
pro_adr = random.choice(self.proxyList)
print("USE PROXY -> " + pro_adr)
request.meta['proxy'] = "http://" + pro_adr
url = request.url;
user_agent = 'Mozilla/4.0 (compatible; MSIE 5.5; windows NT)'
headers = {
'User-Agent': user_agent}
r = requests.post(url, headers=headers)
body = r.content
return HtmlResponse(url, encoding='utf-8', status=200, body=body)
我们可以在proxyList中添加任意多的地址,该方法可以随机选择服务器地址来访问。
最后需要再一次在settingups.py里面再次添加配置
# Enable or disable downloader middlewares
# See http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
DOWNLOADER_MIDDLEWARES = {
'learnScrapy.proxymiddleware.ProxyMiddleware': 100
}
便可以实现代理访问了。