“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)