为什么scrapy 爬取多个网站没法爬中纪委网站

使用Scrapy爬取知乎网站
本文主要记录使用使用 Scrapy 登录并爬取知乎网站的思路。Scrapy的相关介绍请参考 使用Scrapy抓取数据。
相关代码,见 /javachen/scrapy-zhihu-github ,在阅读这部分代码之前,请先了解 Scrapy 的一些基本用法。
本文主要记录使用使用 Scrapy 登录并爬取知乎网站的思路。Scrapy的相关介绍请参考 。
相关代码,见
,在阅读这部分代码之前,请先了解 Scrapy 的一些基本用法。
使用cookie模拟登陆
关于 cookie 的介绍和如何使用 python 实现模拟登陆,请参考。
从这篇文章你可以学习到如何获取一个网站的 cookie 信息。下面所讲述的方法就是使用 cookie 来模拟登陆知乎网站并爬取用户信息。
一个模拟登陆知乎网站的示例代码如下:
# -*- coding:utf-8 -*-
from scrapy.selector import Selector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.http import Request,FormRequest
from zhihu.settings import *
class ZhihuLoginSpider(CrawlSpider):
name = 'zhihulogin1'
allowed_domains = ['']
start_urls = ['/lookup/class/']
Rule(SgmlLinkExtractor(allow=r'search/')),
Rule(SgmlLinkExtractor(allow=r'')),
def __init__(self):
self.headers =HEADER
self.cookies =COOKIES
def start_requests(self):
for i, url in enumerate(self.start_urls):
yield FormRequest(url, meta = {'cookiejar': i}, \
headers = self.headers, \
cookies =self.cookies,
callback = self.parse_item)#jump to login page
def parse_item(self, response):
selector = Selector(response)
for ele in selector.xpath('//ul/li[@class="suggest-item"]/div/a/@href').extract():
urls.append(ele)
print urls
上面是一个简单的示例,重写了 start_requests 方法,针对 start_urls 中的每一个url,这里为 ,重新创建 FormRequest 请求该 url,并设置 headers 和 cookies 两个参数,这样可以通过 cookies 伪造登陆。
FormRequest 请求中有一个回调函数 parse_item 用于解析页面内容。
HEADER 和 COOKIES 在 settings.py 中定义如下:
"Host": "",
"Connection": "keep-alive",
"Cache-Control": "max-age=0",
"Accept": "text/html,application/xhtml+xml,application/q=0.9,image/webp,*/*;q=0.8",
"User-Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/34.0. Safari/537.36",
"Referer": "/people/raymond-wang",
"Accept-Encoding": "gzip,deflate,sdch",
"Accept-Language": "zh-CN,q=0.8,en-US;q=0.6,q=0.4,zh-TW;q=0.2",
'checkcode':r'"$2a$10$9FVE.1nXJKq/F.nH62OhCevrCqs4skby2bC4IO6VPJITlc7Sh.NZa"',
'c_c':r'a153f1f7',
'_ga':r'GA1.2..',
'zata':.634a988abbd3f1f7f31f37.470330',
'q_c1':r'59c45c60a48d4a5f9a12a52028a9aee7|0|0',
'_xsrf':r'2a7cf7208bf24dbda3f70d953e948135',
'q_c0':r'"NmE0NzBjZTdmZGI4Yzg3ZWE0NjhkNjkwZGNiZTNiN2F8V2FhRTQ1QklrRjNjNGhMdQ==||a801fc83ab07cbde58dcf3fa15cff"',
'__utma':r'',
'__utmb':r'.10.',
'__utmc':r'',
'__utmz':r'.3.|utmccn=(referral)|utmcmd=referral|utmcct=/people/hallson',
'__utmv':r'-1|2=registration_date=^3=entry_date='
这两个参数你都可以通过浏览器的一些开发工具查看到,特别是 COOKIES 中的信息。
通过账号登陆
使用账户和密码进行登陆代码如下:
# -*- coding:utf-8 -*-
from scrapy.selector import Selector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.http import Request,FormRequest
import sys
reload(sys)
sys.setdefaultencoding('utf-8')
class ZhihuUserSpider(CrawlSpider):
name = 'zhihu_user'
allowed_domains = ['']
start_urls = ["/lookup/people",]
#使用rule时候,不要定义parse方法
Rule(SgmlLinkExtractor(allow=("/lookup/class/[^/]+/?$", )), follow=True,callback='parse_item'),
Rule(SgmlLinkExtractor(allow=("/lookup/class/$", )), follow=True,callback='parse_item'),
Rule(SgmlLinkExtractor(allow=("/lookup/people", )),
callback='parse_item'),
def __init__(self,
**kwargs):
super(ZhihuLoginSpider, self).__init__(*a, **kwargs)
def start_requests(self):
return [FormRequest(
formdata = {'email':'XXXXXX',
'password':'XXXXXX'
callback = self.after_login
def after_login(self, response):
for url in self.start_urls:
yield self.make_requests_from_url(url)
def parse_item(self, response):
selector = Selector(response)
for link in selector.xpath('//div[@id="suggest-list-wrap"]/ul/li/div/a/@href').extract():
===& /people/javachen
yield Request(host+link+"/about", callback=self.parse_user)
def parse_user(self, response):
selector = Selector(response)
user = ZhihuUserItem()
user['_id']=user['username']=response.url.split('/')[-2]
user['url']= response.url
user['nickname'] = ''.join(selector.xpath("//div[@class='title-section ellipsis']/a[@class='name']/text()").extract())
user['location'] = ''.join(selector.xpath("//span[@class='location item']/@title").extract())
user['industry'] = ''.join(selector.xpath("//span[@class='business item']/@title").extract())
user['sex'] = ''.join(selector.xpath('//div[@class="item editable-group"]/span/span[@class="item"]/i/@class').extract()).replace("zg-icon gender ","")
user['description'] = ''.join(selector.xpath("//span[@class='description unfold-item']/span/text()").extract()).strip().replace("\n",'')
user['view_num'] = ''.join(selector.xpath("//span[@class='zg-gray-normal']/strong/text()").extract())
user['update_time'] = str(datetime.now())
#抓取用户信息,此处省略代码
该代码逻辑如下:
重写 start_requests 方法,通过设置 FormRequest 的 formdata 参数,这里是 email 和 password,然后提交请求到 /login进行登陆,如果登陆成功之后,调用 after_login 回调方法。
在 after_login 方法中,一个个访问 start_urls 中的 url
rules 中定义了一些正则匹配的 url 所对应的回调函数
在 parse_user 方法里,你可以通过 xpath 获取到用户的相关信息,也可以去获取关注和粉丝列表的数据。
例如,先获取到用户的关注数 followee_num,就可以通过下面一段代码去获取该用户所有的关注列表。代码如下
_xsrf = ''.join(selector.xpath('//input[@name="_xsrf"]/@value').extract())
hash_id = ''.join(selector.xpath('//div[@class="zm-profile-header-op-btns clearfix"]/button/@data-id').extract())
num = int(followee_num) if followee_num else 0
page_num = num/20
page_num += 1 if num%20 else 0
for i in xrange(page_num):
params = json.dumps({"hash_id":hash_id,"order_by":"created","offset":i*20})
payload = {"method":"next", "params": params, "_xsrf":_xsrf}
yield Request("/node/ProfileFolloweesListV2?"+urlencode(payload), callback=self.parse_follow_url)
然后,你需要增加一个处理关注列表的回调方法 parse_follow_url,这部分代码如下:
def parse_follow_url(self, response):
selector = Selector(response)
for link in selector.xpath('//div[@class="zm-list-content-medium"]/h2/a/@href').extract():
===& /people/peng-leslie-97
username_tmp = link.split('/')[-1]
if username_tmp in self.user_names:
print 'GET:' + '%s' % username_tmp
yield Request(link+"/about", callback=self.parse_user)
获取粉丝列表的代码和上面代码类似。
有了用户数据之后,你可以再编写一个爬虫根据用户去爬取问题和答案了,这部分代码略去,详细内容请参考 。其中,还有抓取 github 用户等的相关代码。
其他一些技巧
在使用 xpath 过程中,你可以下载浏览器插件 来快速定位元素并获取到 xpath 表达式,关于该插件用法,请自行 google 之。
由于隐私设置的缘故,有些用户可能没有显示一些数据,故针对某些用户 xpath 表达式可能会抛出一些异常,如下面代码获取用户的名称:
user['nickname'] = selector.xpath("//div[@class='title-section ellipsis']/a[@class='name']/text()").extract()[0]
你可以将上面代码修改如下,以避免出现一个异常:
user['nickname'] = ''.join(selector.xpath("//div[@class='title-section ellipsis']/a[@class='name']/text()").extract())
版权声明:本文内容由互联网用户自发贡献,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】红轴机械键盘、无线鼠标等753个大奖,先到先得,云栖社区首届博主招募大赛9月21日-11月20日限时开启,为你再添一个高端技术交流场所&&
阿里云依据网站不同的发展阶段,提供更合适的架构方案,有效降低网站的开发运维难度和整体IT成本,并保障网站的安全性...
国内建站市场NO.1
是将源站内容分发至全国所有的节点,缩短用户查看对象的延迟,提高用户访问网站的响应速度与网站的可用性,解决网络带宽...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
MaxCompute75折抢购
Loading...用scrapy爬取读远网站书籍信息 - 简书
用scrapy爬取读远网站书籍信息
这里是spiders
Paste_Image.png
# -*- coding: utf-8 -*-
import scrapy
from scrapy_redis.spiders import RedisSpider
from Program.items import ProgramItem
class ReadcolorSpider(RedisSpider):
name = "readcolorredis"
allowed_domains = [""]
redis_key = 'readcolorredis:star_urls'
start_urls = ['/lists']这句话一定要打开,不然就算网址喂给了redis,爬虫也读取不了
def parse(self, response):
book_list_group = response.xpath('//article[@style="margin:10px 0 20"]')
for book_list in book_list_group:
item = ProgramItem()
item['book_list_title'] = book_list.xpath('header/h3/a/text()').extract()[0]
item['book_number'] = book_list.xpath('p/a/text()').extract()[0]
book_list_url = book_list.xpath('header/h3/a/@href').extract()[0]
yield scrapy.Request(self.url + book_list_url, callback=self.parse_book_list_detail, meta={'item': item})这句话,
将找到的每个书单的链接调用下面的函数,提取书单里面的信息
next_page = response.xpath('//li[@class="next"]/a/@href').extract()
if next_page:
yield scrapy.Request(next_page[0], callback=self.parse)让爬虫自动爬取下一页
def parse_book_list_detail(self, response):
item = response.meta['item']
summary = response.xpath('//div[@id="list-description"]/p/text()').extract()
item['book_list_summary'] = '\n'.join(summary)
#item['book_url']=response.xpath('//div[@id="body"]/div/div[3]/div[1]/ul[2]/li[1]/div/article/h3/a/@href').extract()[0]
item['book_list_author'] =response.xpath('//div[@id="body"]/div/div[3]/div[1]/article/header/div/div/a/text()').extract()[0]
item['book_list_date'] = response.xpath('//div[@id="body"]/div/div[3]/div[1]/article/header/div/div/text()').extract()[0]
#item['book_name']=response.xpath('//div[@id="body"]/div/div[3]/div[1]/ul[2]/li[1]/div/article/h3/a/text()').extract()[0]
#item['book_author'] =response.xpath('//div[@id="body"]/div/div[3]/div[1]/ul[2]/li[1]/div/article/h3/small/text()').extract()[0]
#item['book_summary']=response.xpath('//div[@id="body"]/div/div[3]/div[1]/ul[2]/li[1]/div/article/p/text()').extract()[0]
book_list = response.xpath('//li[@class="lists-book"]/div[@class="media"]/article')
for book in book_list:
item_book = item.copy()
# 深度copy,否则后面的结果会覆盖前面的结果。
item_book['book_name'] = book.xpath('h3/a/text()').extract()[0]
item_book['book_url'] = book.xpath('h3/a/@href').extract()[0]
book_author = book.xpath('h3/small/text()').extract()
item_book['book_author'] = book_author[0] if book_author else 'N/A'
# 由于书的作者和简介可能为空,因此这里需要做判断
book_summary = book.xpath('p/text()').extract()
item_book['book_summary'] = book_summary[0] if book_summary else 'N/A'
yield item_book
yield item
这是pipeline文件的代码
# -*- coding: utf-8 -*-
# Define your item pipelines here
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: http://doc.scrapy.org/en/latest/topics/item-pipeline.html
import pymongo
from scrapy.conf import settings
class ProgramPipeline(object):
'''def __init__(self):
client = pymongo.MongoClient()
db = client[settings['MONGODB_DBNAME']]
self.post = db[settings['MONGODB_DOCNAME']]'''
def __init__(self):
host=settings['MONGODB_HOST']
port=settings['MONGODB_PORT']
db_name = settings['MONGODB_DBNAME']
client=pymongo.MongoClient(host=host,port=port)链接数据库
db=client[db_name]
self.post=db[settings['MONGODB_DOCNAME']]
def process_item(self, item, spider):
book_info=dict(item)
self.post.insert(book_info)
return item
这是setting里面的代码,存数据库端口一些信息,以及redis所在的一些信息,因为redis在本机,所以redis的IP就不用写出来,如果读取别的电脑的redis上的链接,就要写出来,这是分布式爬虫的原来如果是别的
Paste_Image.png
# -*- coding: utf-8 -*-
# Scrapy settings for Program project
# For simplicity, this file contains only settings considered important or
# commonly used. You can find more settings consulting the documentation:
http://doc.scrapy.org/en/latest/topics/settings.html
http://scrapy.readthedocs.org/en/latest/topics/downloader-middleware.html
http://scrapy.readthedocs.org/en/latest/topics/spider-middleware.html
BOT_NAME = 'Program'
SPIDER_MODULES = ['Program.spiders']
NEWSPIDER_MODULE = 'Program.spiders'
# Crawl responsibly by identifying yourself (and your website) on the user-agent
USER_AGENT = 'Mozilla/5.0 (M Intel Mac OS X 10_11_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/52.0. Safari/537.36'
# Obey robots.txt rules
ROBOTSTXT_OBEY = False
DOWNLOAD_DELAY = 1 #每次请求间隔1秒
# Disable cookies (enabled by default)
COOKIES_ENABLED = False
# Enables scheduling storing requests queue in redis.
SCHEDULER = "scrapy_redis.scheduler.Scheduler"调度器
# Ensure all spiders share same duplicates filter through redis.
DUPEFILTER_CLASS = "scrapy_redis.dupefilter.RFPDupeFilter"
# Configure item pipelines
# See http://scrapy.readthedocs.org/en/latest/topics/item-pipeline.html
ITEM_PIPELINES = {
'Program.pipelines.ProgramPipeline': 300,
# Don't cleanup redis queues, allows to pause/resume crawls.
SCHEDULER_PERSIST = True
SCHEDULER_QUEUE_CLASS = "scrapy_redis.queue.SpiderPriorityQueue"队列顺序
MONGODB_HOST = '127.0.0.1'
MONGODB_PORT = 27017
MONGODB_DBNAME = 'jikexueyuan'
Paste_Image.png
爬虫工程师,文章多数代码都放在github上/xiaobeibei26问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
刚开始学习用Scrapy做爬虫,但是在终端里面显示的结果只是unicode字符的代码,而不是中文(如下图),想请教一下是什么原因造成的,怎么解决。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
这个问题应该是因为这些中文字符串是在列表里的,所有会显示成这样。你可以遍历打印!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
可以参考一下这个问题:
同步到新浪微博
分享到微博?
你好!看起来你挺喜欢这个内容,但是你还没有注册帐号。 当你创建了帐号,我们能准确地追踪你关注的问题,在有新答案或内容的时候收到网页和邮件通知。还能直接向作者咨询更多细节。如果上面的内容有帮助,记得点赞 (????)? 表示感谢。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:目标是爬取网站/上全部的商品数据信息,包括商品的一级类别,二级类别,商品title,品牌,价格。
搜索了一下,python的scrapy是一个不错的爬虫框架,于是基于scrapy写了一个简易的爬虫。
先分析商品页面,在/主页面上,有类链接有用的链接,即:/Shopping/category.aspx?cateID=11和/Shopping/subcategory.aspx?cateID=185&small=1,前者为一级类别,后者为二级类别,这两级类别含有部分商品信息,但是没有包含文章开头所需的五类商品信息。而与/shopping/productdetail.aspx?pdtID=33158&fromPromType=tttj类似的链接中,上述五种信息,均包含。所以计划以/Shopping/alllist.aspx,/Shopping/category.aspx?cateID,/Shopping/subcategory.aspx?cateID三类链接为入口,对/Shopping/category.aspx?cateID及/Shopping/subcategory.aspx?cateID类链接进行自动抓取,同时遇到/shopping/productdetail.aspx?类链接,进行页面解析,解析出所需的五类信息。
爬虫实现了自动爬取,item去重,链接去重,取出的数据存入数据库。
代码详见: /darlwen/spider
阅读(...) 评论()

我要回帖

更多关于 python爬虫框架scrapy 的文章

 

随机推荐