经常在爬有些网站的时候需要登录,大多数网站需要你提供一个用户名和密码,在这种情况下,需要先向网站发送一个POST请求。可以使用Scrapy的FormRequest类,这个类和Request类很相似,只是多了一个extra参数,用这个参数可以传递表单数据。要使用这个类,先导入:
方法1:
from scrapy.http import FormRequest
然后把start_urls替换成start_requests()方法,因为在这种情况下需要的不仅仅是一些URL(start_requests()方法的默认行为是从start_urls取出URL发出请求)。
在start_requests()方法中创建并返回一个FormRequest:
# Start with a login request
def start_requests(self):
return [
FormRequest(
"http://web:9312/dynamic/login",
formdata={"user": "user", "pass": "pass"}
)]
from_response()方法包含了表单所有的包括隐藏的域,我们需要做的仅仅是用formdata参数填充user和pass域并返回FormRequest对象即可。相关代码如下:
# Start on the welcome page
def start_requests(self):
return [
Request(
"http://web:9312/dynamic/nonce", callback=self.parse_welcome)
]
# Post welcome page's first form with the given user/pass
def parse_welcome(self, response):
return FormRequest.from_response(
response,
formdata={"user": "user", "pass": "pass"}
)
方法2:
# coding=utf-8
import scrapy
from scrapy.selector import Selector
class LoginSpidersPyw(scrapy.Spider):
#scrapy crawl LoginSpiders 定义爬虫的名称
name = "LoginSpiders"
#定义允许抓取的域名,如果不是在此列表的域名则放弃抓取
allowed_domains = ['pyw.cn']
#登录网址
LoginUrl="http://v.pyw.cn/login/index"
#登录验证接口
LoginCheckUrl="http://v.pyw.cn/login/check"
#所要爬取的网址
start_urls=["http://v.pyw.cn/Data/accountdetail/1",
"http://v.pyw.cn/Data/accountdetail/2",
"http://v.pyw.cn/Data/accountdetail/3",
"http://v.pyw.cn/Data/accountdetail/4"]
#登录数据:用户名、用户密码、是否记住用户名
formdata = {
"username": "15880xxxxxx",
"password": "a123456",
"remember": "1"
}
#记录当前属于第几笔记录,累计
PageIndex=0
#重写爬虫类:加载登录页面,并回调post_login登录提交数据
def start_requests(self):
return [scrapy.Request(
url=self.LoginUrl,
meta={'cookiejar': 1},
callback=self.post_login)]
#执行提交所要登录的数据信息,
def post_login(self,response):
#验证登录
return [scrapy.FormRequest.from_response(response,
url=self.LoginCheckUrl,
meta={'cookiejar': response.meta['cookiejar']},
formdata=self.formdata,
callback=self.after_login,
method="POST"
)]
#登录成功后调用所要爬取的网址,start_urls中的网址逐一爬取
def after_login(self,response):
for u in self.start_urls:
yield scrapy.Request(url=u,
meta={'cookiejar': response.meta['cookiejar']},
callback=self.parse_details
)
#爬取对应的页面信息,单页信息
def parse_details(self,response):
#选择当前页面的所有信息
sel=Selector(response)
#解析出table中的所有tr
trItems=sel.xpath('//table[@class="table fn-mt-20"]//tr')
#解析tr中的所有数据
for tr in trItems:
self.PageIndex = self.PageIndex + 1
print "===No." + str(self.PageIndex)+"=="
tdItems = tr.xpath('//td/text()')
print tdItems[0].extract().strip()
print tdItems[1].extract().strip()
print tdItems[2].extract().strip()
print tdItems[3].extract().strip()
print tdItems[4].extract().strip()
print tdItems[5].extract().strip()
print tdItems[6].extract().strip()
print tdItems[7].extract().strip()
print tdItems[8].extract().strip()
pass
文章来源于:
http://blog.csdn.net/u013533810/article/details/54866466
http://blog.csdn.net/q_an1314/article/details/51038114