Python网络爬虫教程:知乎爬虫案例

Python网络爬虫教程:知乎爬虫案例[Python常见问题]

一、zhihuSpider.py 爬⾍代码:

#!/usr/bin/env python
# -*- coding:utf-8 -*-
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.selector import Selector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.http import Request, FormRequest
from zhihu.items import ZhihuItem
class ZhihuSipder(CrawlSpider) :
name = "zhihu"
allowed_domains = ["www.zhihu.com"]
start_urls = [ "http://www.zhihu.com" ]
rules = (
Rule(SgmlLinkExtractor(allow = ("/question/d+#.*?", )), ca
llback = "parse_page", follow = True),
Rule(SgmlLinkExtractor(allow = ("/question/d+", )), callba
ck = "parse_page", follow = True),
)
headers = {
"Accept": "*/*",
"Accept-Encoding": "gzip,deflate",
"Accept-Language": "en-US,en;q=0.8,zh-TW;q=0.6,zh;q=0.4",
"Connection": "keep-alive",
"Content-Type":" application/x-www-form-urlencoded; charset=UTF
-8",
"User-Agent": "Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_1)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/38.0.2125.111 Safari/
537.36",
"Referer": "http://www.zhihu.com/" }#重写了爬⾍类的⽅法, 实现了⾃定义请求, 运⾏成功后会调⽤callback 回调
函数
def start_requests(self):
return [Request("https://www.zhihu.com/login", meta = {"coo
kiejar" : 1}, callback = self.post_login)]
#FormRequeset 出问题了
def post_login(self, response):
print "Preparing login"
#下⾯这句话⽤于抓取请求⽹⻚后返回⽹⻚中的_xsrf 字段的⽂字, ⽤于成
功提交表单
xsrf = Selector(response).xpath("//input[@name="_xsrf"]/@va
lue").extract()[0]
print xsrf
#FormRequeset.from_response 是 Scrapy 提供的⼀个函数, ⽤于 post 表 单#登陆成功后, 会调⽤after_login 回调函数
return [FormRequest.from_response(response, #"http://www.
zhihu.com/login",
okiejar"]},
ers
meta = {"cookiejar" : response.meta["co
headers = self.headers, #注意此处的
head
formdata = {
"_xsrf": xsrf,
"email": "1095511864@qq.com",
"password": "123456"
},
callback = self.after_login,
dont_filter = True
)]
def after_login(self, response) :
for url in self.start_urls :
yield self.make_requests_from_url(url)
def parse_page(self, response):
problem = Selector(response)
item = ZhihuItem()
item["url"] = response.url
item["name"] = problem.xpath("//span[@class="name"]/text()"
).extract()
print item["name"]
item["title"] = problem.xpath("//h2[@class="zm-item-title zm-editable-content"]/text()").extract()
item["description"] = problem.xpath("//div[@class="zm-editable-content"]/text()").extract()
item["answer"]= problem.xpath("//div[@class=" zm-editable-c
ontent clearfix"]/text()").extract()
return item
hmoban主题是根据ripro二开的主题,极致后台体验,无插件,集成会员系统
自学咖网 » Python网络爬虫教程:知乎爬虫案例