注册
登录
提问时间:2016/7/9 19:49:01
我想抓取中纪委网站的新闻,进行反腐学习。。。所以我学着用Scrapy框架写了一个爬虫。结果发现:

1. 我在将ccdi.gov.cn/jlsc/index_ 设为起始页start_url的时候, 爬虫返回

[ccdi] DEBUG: Crawled (521) < GET ccdi.gov.cn/jlsc/index_>

2. 我重新找了一个页面 ccdi.gov.cn/was5/web/se 依然出现521状态码。

3. 我查了以下,521状态码意思是: Protocol Extension Not Implemented 请问这是什么意思?是不是因为这个原因,我怎么设置都没法爬了?(只有首页http://www.ccdi.gov.cn/可以爬取)

4. 我的代码贴在下面,请指正。

##更新了cookie的代码,但是似乎返回同样的结果。

#encoding: utf-8

import sys
import scrapy
import re
from scrapy.selector import Selector
from scrapy.http.request import Request
from ccdi.items import CcdiItem
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider,Rule

class CcdiSpider(CrawlSpider):
name = "ccdi"
allowed_domains = ["ccdi.gov.cn"]
start_urls = "http://www.ccdi.gov.cn/jlsc/index_2.html"
#rules = (
# Rule(SgmlLinkExtractor(allow=r"/jlsc/+", ),
# callback="parse_ccdi", follow=True),
#
#)

def start_requests(self):
yield Request(self.start_urls, cookies={'NAME':'Value'},callback=self.parse_ccdi)


def parse_ccdi(self, response):
item = CcdiItem()
self.get_title(response, item)
self.get_url(response, item)
self.get_time(response, item)
self.get_keyword(response, item)
self.get_text(response, item)
return item

def get_title(self,response,item):
title = response.xpath("/html/head/title/text()").extract()
if title:
item['ccdi_title']=title

def get_text(self,response,item):
ccdi_body=response.xpath("//div[@class='TRS_Editor']/div[@class='TRS_Editor']/p/text()").extract()
if ccdi_body:
item['ccdi_body']=ccdi_body

def get_time(self,response,item):
ccdi_time=response.xpath("//em[@class='e e2']/text()").extract()
if ccdi_time:
item['ccdi_time']=ccdi_time[0][5:]

def get_url(self,response,item):
ccdi_url=response.url
if ccdi_url:
print ccdi_url
item['ccdi_url']=ccdi_url

def get_keyword(self,response,item):
ccdi_keyword=response.xpath("//html/head/meta[@http-equiv = 'keywords']/@content").extract()
if ccdi_keyword:
item['ccdi_keyword']=ccdi_keyword

我想抓取中纪委网站的新闻,进行反腐学习。。。所以我学着用Scrapy框架写了一个爬虫。结果发现:

1. 我在将http://www.ccdi.gov.cn/jlsc/index_1.html 设为起始页start_url的时候, 爬虫返回


[ccdi] DEBUG: Crawled (521) < GET http://ccdi.gov.cn/jlsc/index_1.html>

2. 我重新找了一个页面 http://www.ccdi.gov.cn/was5/web/search?channelid=202789&page=1 依然出现521状态码。

3. 我查了以下,521状态码意思是: Protocol Extension Not Implemented 请问这是什么意思?是不是因为这个原因,我怎么设置都没法爬了?(只有首页http://www.ccdi.gov.cn/可以爬取)

4. 我的代码贴在下面,请指正。

##更新了cookie的代码,但是似乎返回同样的结果。

#encoding: utf-8 import sys import scrapy import re from scrapy.selector import Selector from scrapy.http.request import Request from ccdi.items import CcdiItem from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor from scrapy.contrib.spiders import CrawlSpider,Rule class CcdiSpider(CrawlSpider): name = "ccdi" allowed_domains = ["ccdi.gov.cn"] start_urls = "http://www.ccdi.gov.cn/jlsc/index_2.html" #rules = ( # Rule(SgmlLinkExtractor(allow=r"/jlsc/+", ), # callback="parse_ccdi", follow=True), # #) def start_requests(self): yield Request(self.start_urls, cookies={'NAME':'Value'},callback=self.parse_ccdi) def parse_ccdi(self, response): item = CcdiItem() self.get_title(response, item) self.get_url(response, item) self.get_time(response, item) self.get_keyword(response, item) self.get_text(response, item) return item def get_title(self,response,item): title = response.xpath("/html/head/title/text()").extract() if title: item['ccdi_title']=title def get_text(self,response,item): ccdi_body=response.xpath("//div[@class='TRS_Editor']/div[@class='TRS_Editor']/p/text()").extract() if ccdi_body: item['ccdi_body']=ccdi_body def get_time(self,response,item): ccdi_time=response.xpath("//em[@class='e e2']/text()").extract() if ccdi_time: item['ccdi_time']=ccdi_time[0][5:] def get_url(self,response,item): ccdi_url=response.url if ccdi_url: print ccdi_url item['ccdi_url']=ccdi_url def get_keyword(self,response,item): ccdi_keyword=response.xpath("//html/head/meta[@http-equiv = 'keywords']/@content").extract() if ccdi_keyword: item['ccdi_keyword']=ccdi_keyword … 显示全部
1楼(未知网友)

这种页数不太多的建议自己写爬虫,比直接用scrapy灵活性强一些。这种内容并不是很多的页面用bs4/re+requests+gevent/threading已经可以随意抓了,我始终觉得爬虫难在爬下来的东西要怎么处理。
不知道页面是怎么跳的时候祭出神器Wireshark。
2楼(未知网友)

爬虫是蛀虫,害怕中纪委,不敢爬中纪委的网站。
3楼(匿名用户)

祭出神器
http://jeanphix.me/Ghost.py/
4楼(未知网友)

无论是什么设备,第一次访问该站,都会弹出一个521的错误状态码,与此同时还会返回一个Cookie。
浏览器接受到状态码与Cookie,会再次进行一次请求,因为接收到了Set-Cookie,所以第二次的Request Headers会附上之前接收到的Cookie。
这样的请求才是成功的。

这个防爬虫的方法非常基础,利用了普通爬虫与浏览器对于Status Code的处理方式不同。

你要爬取,只需要先请求一次,获得一个Cookie并保存,然后之后所有的请求都附上这个保存下来的Cookie,这样就行了。

爬虫的要诀在于:尽力模仿用户使用浏览器的行为。
立即注册站大爷用户,免费试用全部产品
立即注册站大爷用户,免费试用全部产品