日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

scrapy模拟登录新浪微博

發布時間:2025/3/13 编程问答 17 豆豆
生活随笔 收集整理的這篇文章主要介紹了 scrapy模拟登录新浪微博 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

hi:

  all, scrapy搞模擬登錄真的很簡單哦,以下均是在你安裝scrapy成功的前提下哦.

  首先,分析新浪微薄的登錄流程,使用抓包工具得到下面的圖片:

一般來說,登錄主要就是對服務器進行post數據過去,如果對方有驗證碼,需要驗證碼識別之類的東西,那是計算機圖形學干的事,scrapy干不了,而新浪微博比較特別,首先大家應該清楚,新浪是個大公司,不會那么簡單直接讓你post數據的,所以在post請求前有一個get請求,去獲取服務器的一些參數,那么,我們做的第一個事情是寫一個get請求:

第一步,使用scrapy的shell命令創建一些模板

E:\workspace\TribuneSpider\src>scrapy genspider -t crawl weibo weibo.com
Created spider
'weibo' using template 'crawl' in module:
src.spiders.weibo

 形如以上代碼,后2行是scrapy給你的提示。生成以下模塊化代碼

#! -*- encoding:utf-8 -*-
import re

from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from src.items import SrcItem

class WeiboSpider(CrawlSpider):
'''
這是一個使用scrapy模擬登錄新浪微博的例子,
希望能對廣大的同學有點幫助
'''

name
= 'weibo'
allowed_domains
= ['weibo.com']
start_urls
= ['http://www.weibo.com/']

rules
= (
Rule(SgmlLinkExtractor(allow
=r'Items/'), callback='parse_item', follow=True),
)

def parse_item(self, response):
hxs
= HtmlXPathSelector(response)
i
= SrcItem()
#i['domain_id'] = hxs.select('//input[@id="sid"]/@value').extract()
#i['name'] = hxs.select('//div[@id="name"]').extract()
#i['description'] = hxs.select('//div[@id="description"]').extract()
return i

第二步,修改設置,繼承自CrawlSpider類的WeiboSpider的name,allowed_domains屬性是必須的,但是start_urls屬性是可以不要的,改由其他方法生成,接下來修改代碼,獲取新浪的第一的鏈接返回的值,提前我們先要知道一般這個鏈接返回什么格式:

sinaSSOController.preloginCallBack({"retcode":0,"servertime":1314019864,"nonce":"J1F9XN"})

  返回的是形如以上代碼段的格式內容,而以上內容在post登錄時是需要這3個屬性的。修改后代碼為:

#! -*- encoding:utf-8 -*-
import re
import time

from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.http import Request

from src.items import SrcItem

class WeiboSpider(CrawlSpider):
'''
這是一個使用scrapy模擬登錄新浪微博的例子,
希望能對廣大的同學有點幫助
'''

name
= 'weibo'
allowed_domains
= ['weibo.com', 'sina.com.cn']


def start_requests(self):
username
= '********'
url
= 'http://login.sina.com.cn/sso/prelogin.php?entry=miniblog&callback=sinaSSOController.preloginCallBack&user=%s&client=ssologin.js(v1.3.14)&_=%s' % \
(username, str(time.time()).replace('.', '')
)
print url
return [Request(url=url, method='get', callback=self.parse_item)]


def parse_item(self, response):
print response.body
hxs
= HtmlXPathSelector(response)
i
= SrcItem()
#i['domain_id'] = hxs.select('//input[@id="sid"]/@value').extract()
#i['name'] = hxs.select('//div[@id="name"]').extract()
#i['description'] = hxs.select('//div[@id="description"]').extract()
return i

  代碼說明:

1    1. 首先scrapy有一個offsite機制,即是否抓其他域名,需要將allowed_domains屬性添加上sina.com.cn,

     ?2. 分析get的鏈接的特點,得出以下結論:get方式需要你傳遞你的用戶名和你當前發送請求的時間撮,一般使用time.time()是13位的時間撮,只不過是有個頓號而已。去掉之。

     ?3. 使用callback來指定回滾函數,這里涉及到scrapy的內部執行機制,還挺深,不延展了。然后在parse_item中打印response.body,即返回的這個response的主題內容,response對象有很多屬性,比如response.request, response.url,response.headers等等。這個你可以自己用dir(response)查看的。

接下來執行當前這個爬蟲,看是否能正常工作,執行結果:

E:\workspace\TribuneSpider\src>scrapy crawl weibo
2011-08-22 22:02:47+0800 [scrapy] INFO: Scrapy 0.12.0.2539 started (bot: src)
2011-08-22 22:02:47+0800 [scrapy] DEBUG: Enabled extensions: TelnetConsole, SpiderContext, WebService, CoreStats, CloseSpider
2011-08-22 22:02:47+0800 [scrapy] DEBUG: Enabled scheduler middlewares: DuplicatesFilterMiddleware
2011-08-22 22:02:47+0800 [scrapy] DEBUG: Enabled downloader middlewares: HttpAuthMiddleware, DownloadTimeoutMiddleware, UserAgentMiddleware, Re
leware, DefaultHeadersMiddleware, RedirectMiddleware, CookiesMiddleware, HttpCompressionMiddleware, DownloaderStats
2011-08-22 22:02:47+0800 [scrapy] DEBUG: Enabled spider middlewares: HttpErrorMiddleware, OffsiteMiddleware, RefererMiddleware, UrlLengthMiddle
epthMiddleware
2011-08-22 22:02:47+0800 [scrapy] DEBUG: Enabled item pipelines: SrcPipeline
http:
//login.sina.com.cn/sso/prelogin.php?entry=miniblog&callback=sinaSSOController.preloginCallBack&user=*******&client=ssologin.js(v
&_=131402176767
2011-08-22 22:02:47+0800 [scrapy] DEBUG: Telnet console listening on 0.0.0.0:6023
2011-08-22 22:02:47+0800 [scrapy] DEBUG: Web service listening on 0.0.0.0:6080
2011-08-22 22:02:47+0800 [weibo] INFO: Spider opened
2011-08-22 22:02:47+0800 [weibo] DEBUG: Crawled (200) <GET http://login.sina.com.cn/sso/prelogin.php?entry=miniblog&callback=sinaSSOController.
nCallBack
&user=******&client=ssologin.js(v1.3.14)&_=131402176767> (referer: None)
sinaSSOController.preloginCallBack({
"retcode":0,"servertime":1314021767,"nonce":"0G2Q3S"})
2011-08-22 22:02:47+0800 [weibo] DEBUG: Scraped SrcItem() in <http://login.sina.com.cn/sso/prelogin.php?entry=miniblog&callback=sinaSSOControll
oginCallBack
&user=********&client=ssologin.js(v1.3.14)&_=131402176767>
2011-08-22 22:02:47+0800 [weibo] INFO: Passed SrcItem()
2011-08-22 22:02:47+0800 [weibo] INFO: Closing spider (finished)
2011-08-22 22:02:47+0800 [weibo] INFO: Spider closed (finished)

你看到這里有sinaSSOControlloginCallBack&user=********&client=ssologin.js(v1.3.14)&_=131402176767>這個了嗎?bingo


接下來加東西,加post請求啊.

1. 分析post請求的數據:

  case:博客園,我的心你傷不起啊,也太慢了吧,上傳個圖片我的媽呀,真是個拖拉機

其實也就很簡單了,直接把這一堆值給post的地址url 全部post過去,這還不簡單?!!!

現在添加實現代碼如下:

#! -*- encoding:utf-8 -*-
import re
import os
import time

from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.http import Request
from scrapy.http import FormRequest

from src.items import SrcItem

class WeiboSpider(CrawlSpider):
'''
這是一個使用scrapy模擬登錄新浪微博的例子,
希望能對廣大的同學有點幫助
'''

name
= 'weibo'
allowed_domains
= ['weibo.com', 'sina.com.cn']


def start_requests(self):
username
= '*******'
url
= 'http://login.sina.com.cn/sso/prelogin.php?entry=miniblog&callback=sinaSSOController.preloginCallBack&user=%s&client=ssologin.js(v1.3.14)&_=%s' % \
(username, str(time.time()).replace(
'.', ''))
print url
return [Request(url=url, method='get', callback=self.post_message)]

def post_message(self, response):
serverdata
= re.findall('{"retcode":0,"servertime":(.*?),"nonce":"(.*?)"}', response.body, re.I)[0]
print serverdata
servertime
= serverdata[0]
print servertime
nonce
= serverdata[1]
print nonce
formdata
= {"entry" : 'miniblog',
"gateway" : '1',
"from" : "",
"savestate" : '7',
"useticket" : '1',
"ssosimplelogin" : '1',
"username" : '**********',
"service" : 'miniblog',
"servertime" : servertime,
"nonce" : nonce,
"pwencode" : 'wsse',
"password" : '*********',
"encoding" : 'utf-8',
"url" : 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
"returntype" : 'META'}

return [FormRequest(url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.14)',
formdata
= formdata,callback=self.parse_item) ]


def parse_item(self, response):
with open(
'%s%s%s' % (os.getcwd(), os.sep, 'logged.html'), 'wb') as f:
f.write(response.body)

  接下來驗證,查看文件logged.html內容:

<html><head><script language='javascript'>parent.sinaSSOController.feedBackUrlCallBack({"result":true,"userinfo":{"uniqueid":"1700208252","userid":"×××××××××","displayname":"×××××××××","userdomain":"×××××××××"}});</script></head><body></body></html>null

  有一個result=true,是否成功了呢?別急,我們在加段代碼(實際上,上面的內容是抓包的第三個鏈接返回的內容):

#! -*- encoding:utf-8 -*-
import re
import os
import time

from scrapy.selector import HtmlXPathSelector
from scrapy.contrib.linkextractors.sgml import SgmlLinkExtractor
from scrapy.contrib.spiders import CrawlSpider, Rule
from scrapy.http import Request
from scrapy.http import FormRequest

from src.items import SrcItem

class WeiboSpider(CrawlSpider):
'''
這是一個使用scrapy模擬登錄新浪微博的例子,
希望能對廣大的同學有點幫助 ,這是所有代碼
'''

name
= 'weibo'
allowed_domains
= ['weibo.com', 'sina.com.cn']


def start_requests(self):
username
= '********'
url
= 'http://login.sina.com.cn/sso/prelogin.php?entry=miniblog&callback=sinaSSOController.preloginCallBack&user=%s&client=ssologin.js(v1.3.14)&_=%s' % \
(username, str(time.time()).replace(
'.', ''))
print url
return [Request(url=url, method='get', callback=self.post_message)]

def post_message(self, response):
serverdata
= re.findall('{"retcode":0,"servertime":(.*?),"nonce":"(.*?)"}', response.body, re.I)[0]
print serverdata
servertime
= serverdata[0]
print servertime
nonce
= serverdata[1]
print nonce
formdata
= {"entry" : 'miniblog',
"gateway" : '1',
"from" : "",
"savestate" : '7',
"useticket" : '1',
"ssosimplelogin" : '1',
"username" : '*******',
"service" : 'miniblog',
"servertime" : servertime,
"nonce" : nonce,
"pwencode" : 'wsse',
"password" : '*******',
"encoding" : 'utf-8',
"url" : 'http://weibo.com/ajaxlogin.php?framelogin=1&callback=parent.sinaSSOController.feedBackUrlCallBack',
"returntype" : 'META'}

return [FormRequest(url = 'http://login.sina.com.cn/sso/login.php?client=ssologin.js(v1.3.14)',
formdata
= formdata,callback=self.check_page) ]

def check_page(self, response):
url
= 'http://weibo.com/'
request
= response.request.replace(url=url, method='get', callback=self.parse_item)
return request


def parse_item(self, response):
with open(
'%s%s%s' % (os.getcwd(), os.sep, 'logged.html'), 'wb') as f:
f.write(response.body)

  查看輸出文件,用瀏覽器打開:

成功了吧,朋友們。真正有多少代碼量呢?哦,忘記說了一句,scrapy的FormRequest本身是有一個最簡單的查找提交表單的方法的,即使用FormRequest.from_response()方法,但是,新浪的登錄比較特別,無法查找到表單,所以就采用以上方法。





  

轉載于:https://www.cnblogs.com/CLTANG/archive/2011/08/22/2150031.html

總結

以上是生活随笔為你收集整理的scrapy模拟登录新浪微博的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。