爬取 Stackoverflow 前1000个问题的相关信息。
Scrapy - 爬取外网数据。
如果你没有某墙软件,建议遵循爬虫协议,否则会被强制切断请求。在此基础上,设置 DOWNLOAD_DELAY 爬取时间间隔, 访问不要过于频繁。
经测,设置某墙后,可以在不设爬取时延的状态下,更快更高效的获取数据。如果某强是客户端软件,在 requests 超过TIMEOUT时切换节点可继续获取数据。
此外,添加随机UA中间件以及代理中间件(由于本机有佛跳墙的客户端软件,所以没有开启代理中间件)。
from fake_useragent import UserAgent
class UAMiddleware(object):
def __init__(self):
self.user_agent = UserAgent().random
def process_request(self, request, spider):
request.headers['User-Agent'] = self.user_agent- start_requests() 初始化前100页链接
- 爬取每页问题的详情页链接
- 爬取问题详情页的标题、投票数、正文、标签等信息
- 管道清洗后存入MonogoDB
注意:Reqeust() 过程产生的异常,由error_back()函数接收并在控制台打印错误信息;爬取问题详情页由于部分问题没有code,所以返回None。数据库管道如下:
import pymongo
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_INIT_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):
self.db[item.table].insert(dict(item))
return item
def close_spider(self, spider):
self.client.close()???
