1、 设置多个feed exporter
使用FEEDS参数,(在爬虫类里添加类变量,
使用ip代理
https://www.jianshu.com/p/c656ad21c42f
)
custom_settings = {
'FEEDS' :{
'items.json': {
'format': 'json',
'encoding': 'utf8',
'store_empty': False,
'fields': None,
'indent': 4,
},
'/home/user/documents/items.xml': {
'format': 'xml',
'fields': ['name', 'price'],
'encoding': 'latin1',
'indent': 8,
},
'items.csv': {
'format': 'csv',
'fields': ['brand', 'company'],
},
}
}
2、在爬虫里实现增爬可使用
def start_requests(self):
for url in urls[::-1]:
id = url.split('/')[-1]
if id in ids:
continue
else:
yield scrapy.Request(url=url, callback=self.parse_brand, headers=QuotesSpider.headers)
def parse_category(self, response):
text = transfer(response.text)
# with open('i.html', 'w',encoding='utf8') as f:
# f.write(text)
datas = eval(text)
brands = datas['brands']
for i in brands:
url ='https://fa.kaoputou.com/api/brand/{}'.format(id)
yield scrapy.Request(url=url, callback=self.parse_brand, headers=QuotesSpider.headers)
def parse_brand(self, response):
text = transfer(response.text)
datas = eval(text)
# with open(i['name'] + '_1', 'w', encoding='utf8') as f:
# f.write(str(i))
item = BrandItem()
item['id'] = datas['slug']
item['brand'] = datas['name'] if 'name' in datas else None
yield item
但是要注意,我们配置settings里面并发为1的时候,只限制了第一个解析函数parse_category,而第二个parse_brand依然是并发的,这就可能会导致触发反爬。目前还不知道原因
爬虫的时候尽量不使用增爬可能是对的,先把所有url爬下来,然后最后parse_brand的时候,对面有做反爬处理,所以我们在这个请求函数里面,严格控制1个并发,因为我们是要登陆的,并发超过1会立刻触发反爬
3、爬虫得到的response如果是jason, 则应该转换
def transfer(text):
dic = {'null':'None','false':'False','true':'True'}
for k,v in dic.items():
text = text.replace(k,v)
return text
这样才可以eval(response.text)
requests 如果不设置headers,会默认使用'Content-Type':'text/plain'进行请求,而我们一般是使用json,所以需要带上请求头
headers = {'Content-Type':'application/json'}
response = requests.post('http://127.0.0.1:5002/find_user',data=js, headers = headers)