好久没发博客,突然想发出来:
“While we teach ,we learn”
欢迎提问
'''
模拟登陆思路:
进入登陆页面 post带有form的数据 。。。至此完事
1.
具体实现
.1重写start_request方法 进入登录页面 ,获得response 后使用回调函数将拿到的response给到将要使用的方法(还需要设置cook为开启状态)
.2发送post请求 FormRequest.from_response 方法里面写了5个参数
.3至此成功
2.
.1可以理解为打包发送的内容中含有header 具体实现:传入时 何种形式字典形式 self.head 调用属性 提供了一种思路 发送的时候统统打包发送
3.
类里的方法调用带括号和不带括号区别:
加括号的是类的实例化;不加括号就不是启动实例,
比如 不实例化时可直接调用内部初始变量,实例化后,变量可能被init处理,改变了初始值
4.Request类的参数含义,其返回值为response
# url是要爬取的网址
# callback是回调函数
# method是请求的方式post还是get
# headers是浏览器伪装的头信息
# body是网页源代码信息
# cookies是登入某网站后,网站在你电脑上保留的信息
# meta要携带或者传递的信息
# encoding是编码方式
# priority用来设置访问网站的优先级
# dont_filter是否允许重复爬取网站
'''
import scrapy
from scrapy.http import Request
from scrapy.http import FormRequest
class MndSpider(scrapy.Spider):
path = 'C:\\Users\\Administrator\\Desktop\\Python基础与应用\\爬虫\\scrapy爬取\\'
name = 'mnd'
allowed_domains = ['51pptmoban.com']
#start_urls = ['http://www.51pptmoban.com/e/member/doaction.php']
header = {"User-Agent": 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/95.0.4638.69 Safari/537.36'}
def start_requests(self):#此方法返回一个可迭代对象 用yield本身就是可迭代对象,若是return,用[]将其构造成一个可迭代对象
#首先爬一次登录页,然后进入回调函数parse()#设置cook为开启状态 callback :找到设置的回调的函数然后执行
#url='http://www.51pptmoban.com/e/member/doaction.php'
return [Request('http://www.51pptmoban.com/e/member/login/',headers= self.header,meta={'cookiejar':1},callback=self.parse)]#返回了一个数组 那个东西是response#字典里数字加上英豪就成了自负了 看颜色
def parse(self, response):
data = {
"username" : "你自己写",
"password" : "你自己写"
}
print("登陆中...")#特殊的请求方式,表单方式的请求
return [FormRequest.from_response(response,#此处为何用列表
meta = {'cookiejar':response.meta['cookiejar']},#字典的调用方法 相当于使用的cookiejar对应的values值
#mata = response.meta,#这种写法错误的
headers = self.header,#字典
formdata= data,#字典 而且在内部不需要使用self
callback = self.next,
)] #此时的response已经是登录进入的页面了
'''
对于提交表单有2种方式,上述为一种,此种必须要有response,
适用于输入网站出现的页面有表单信息的,他可以自动识别要post的url
第二种:scrapy.FormRequest 必须输入的除了必要表单数据 他需要的是确定的要post的url,而不是response,respon
是整个页面数据,需要自动识别
即 scrapy.FormRequest更加强大
'''
def next(self,response):
print("方法进入了吗")
a = response.body#返回的是byte类型
#a =response.text #返回的是文本形式的html类型 也就是字符串
#response.text = response.body.decode(response.encoding)
with open(self.path+'登录页面.html','wb') as f:
f.write(a)
#Xpath是一门在xml文档中查找信息的语言,XPath可用来在xml文档中对元素和属性进行遍历按照规律查找信息
print(response.xpath('/html/head//title/text()').extract())
yield Request("http://www.51pptmoban.com/e/member/EditInfo/",callback=self.next2,meta={"cookiejar":True})#设置为cookiejar保存状态
def next2(self,response):
print(response.xpath('//html//head//title//text()').extract())
a = response.body
with open(self.path + '个人中心页面.html', 'wb') as f:
f.write(a)