这是Scrapy实战的第一个项目 所以比较简陋 不健壮
IP地址随机更换、分布式等等都没有
先说一下遇到的一个小坑
计划是直接用paging的next来callback下一页的信息 现成的 拿来就用 结果懵逼了 测试了好多遍都只爬到第一页 为什么就是不回调呢? 怀疑人生ing 怀疑了N小时 才发现next所指引的网址根本打不开 需在在前面加上“https://www.zhihu.com/api/v4/XXXX” 这才是正确的网址 next所指引的链接并没有更新
主要的坑说完了 然后是各个文件的编写
第一步 settings.py 如下修改
1.修改ROBOTS协议
ROBOTSTXT_OBEY = False
2.添加User-Agent
# Override the default request headers:
DEFAULT_REQUEST_HEADERS = {
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
'Accept-Language': 'en',
'User-Agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0.2743.116 Safari/537.36' }
第二步 items.py 如下修改
添加item
class UserItem(Item):
name = scrapy.Field()
answer_count = Field()
articles_count = Field()
XXXX吧啦吧啦
第三步:爬虫脚本主要业务逻辑编写
第四步:pipelines修改(这里以存储MongoBD为例)
class MongoPipeline(object):
def __init__(self,mongo_url,mongo_db):
self.mongo_url= mongo_url
self.mongo_db= mongo_db
@classmethod
def from_crawler(cls,crawler):
return cls(
mongo_url = crawler.settings.get('MONGO_URL'),
mongo_db = crawler.settings.get('MONGO_DB')
)
def open_spider(self,spider):
self.client= pymongo.MongoClient(self.mongo_url)
self.db= self.client[self.mongo_db]
def process_item(self,item,spider):
name= item.__class__.__name__
self.db[name].insert(dict(item))
return item
def close_spider(self,spider):
self.client.close()
第五步 回到settings.py 继续修改
ITEM_PIPELINES= {
'zhihuuser.pipelines.MongoPipeline': 300,
}
第六步: 跑!
本以为数据这么到手了 结果爬了3千多个用户 IP就被封了 过于频繁访问 403拒绝