以前购买了51Talk的课程,上了一段时间没有再上了,现在课程剩两个月了,还有150节课,为了能够不浪费,自己只能含泪每天上两节课来弥补以前懒惰造成的后果,结果发现课程太难约了,尤其是好的老师还有指定的时间的课程,自己想找收藏1000+以上的老师,还要一页一页的翻,可是结果也只能是事倍功半,1000+的老师太难找了,并且我自己的预约时间更是没有课,太惨了,最近刚学了Python,想着能不能通过爬虫来预约课程,于是就有了这个脚本 51TalkBookLesson 来预约收藏1000+老师的课。
Scrapy中的CrawlSpider能够通过Rule规则提取对应的链接并进跟进请求,非常的方便,不需要我们自己一步一步的去请求每一个URL,这非常适合51Talk中老师比较多,页面比较多的情况。
由于51Talk预约课程是需要登录的,所以我使用Cookie来进行账号的识别,我们需要为每一个请求的header添加一个Cookie
1、搜索菲律宾老师的请求
2、老师的信息课程列表的详情
follow=False 是因为,老师详情页面会有一些推荐老师,这些老师可能是欧美外教,是需要使用4次次卡的,我们禁止跟进这些意外情况。
这些请求我们都需要添加Cookie,请求1是需要放在start_urls里面的,请求2的链接是通过Rule规则提取出来的,预约课程请求我则使用python的requests模块,之所以不使用scrapy的FormRequest,是因为FormRequest会被放在已经添加在Scrapy队列里的页面spider请求后面,当前面这些Spider请求完成之后,才能执行我们的预约课程,可是到那时候课程估计已经都没有了,我们需要的是当找到课程之后能够马上请求
1、在根目录下创建一个名字为cookie的文件
2、我们需要先登录51Talk网站,在开发模式下的控制台输入 document.cookie按回车,将cookie输出并粘贴到cookie文件,不需要双引号
Python中reques模块中的请求,Cookie的格式是字符串类型的,可以直接使用,而scrapy.http中的Request的Cookie格式是字典格式的,那么我们就需要将cookie文件中字符串类型cookie转换成字典,下面是转换方法:
搜索菲律宾老师 的链接是需要放在start_urls中的,所以这些请求是 start_requests(self): 方法来生成请求的,那么就需要通过重写该方法并为该请求加上Cookie
老师的信息课程列表的详情 的链接是Rule规则提取的,那就需要在Rule中的 process_request 参数中的方法来进行处理,我写的Rule中的 process_request 的值是 request_teacher ,那就需要定义这样的一个方法来处理Cookie:
预约课程 的链接是需要进post的请求的,我们使用下面的方法:
你可以修改以上参数来预约相应的的老师及课程,其中 need_book_lessons 中的参数 20170524_44 代表2017年5月24日的21:30的课程, _ 前面的代表日期,后面的代表第几节课,时间从 6 点开始,数字从 13 开始,每半个小时数字加 1 , 6:30 则为 14 , 7:00 为 15 ,依次类推,将你需要预约课程的时间添加到 need_book_lessons 中
在发送请求时cookie的 *** 作,meta={'cookiejar':1}表示开启cookie记录,首次请求时写在Request()里
meta={'cookiejar':response.meta['cookiejar']}表示使用上一次response的cookie,写在FormRequest.from_response()里post授权
meta={'cookiejar':True}表示使用授权后的cookie访问需要登录查看的页面
获取Scrapy框架Cookies
请求Cookie
Cookie = response.request.headers.getlist('Cookie')
print(Cookie)
响应Cookie
Cookie2 = response.headers.getlist('Set-Cookie')
print(Cookie2)
# -*- coding: utf-8 -*-
import scrapy
from scrapy.http import Request,FormRequest
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)