路飞学院-Python爬虫实战密训班-第3章

# -*- coding: utf-8 -*-
import  scrapy
from  scrapy.http  import  Request
 
# 我们如果要模拟登陆,就必须要拿到cookie
# response里面有url,text等等,但遗憾的是不想requests,可以直接拿到cookie
# 但我们可以导入一个模块
from  scrapy.http.cookies  import  CookieJar
 
 
class  GetChoutiSpider(scrapy.Spider):
     name  =  'get_chouti'
     allowed_domains  =  [ 'chouti.com' ]
     start_urls  =  [ 'https://dig.chouti.com/' ]
     cookies  =  None
 
     def  parse( self , response):
         # 此时只是拿到了一个存储cookie的容器
         cookie_obj  =  CookieJar()
 
         # response表示请求的所有内容,response.request表示我们发的请求
         # 接受我们上面说的两个参数
         cookie_obj.extract_cookies(response, response.request)
 
         # 那么此时的cookie_obj便保存了我们的cookie信息
         print (cookie_obj._cookies)
 
         '''
                 {'.chouti.com': {'/': {'gpsd': Cookie(version=0, name='gpsd', value='1c61978d6bb94989674386b29f2fd15d', port=None, port_specified=False, domain='.chouti
         .com', domain_specified=True, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=1533183431, discard=False, comment=None, co
         mment_url=None, rest={}, rfc2109=False)}}, 'dig.chouti.com': {'/': {'JSESSIONID': Cookie(version=0, name='JSESSIONID', value='aaaouDhGaca3Ugddzblrw', po
         rt=None, port_specified=False, domain='dig.chouti.com', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, e
         xpires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False)}}}
                 '''
         # 上面便是我们获取的cookie信息
 
         # 将cookie保存起来
         self .cookies  =  cookie_obj._cookies
 
         # 同理request也一样
         '''
         类似于requests
         res = requests.get(xxxxx)
         res.cookies._cookies便是返回的cookie信息
         '''
 
         # 然后就要模拟登陆了,带上用户名和密码和cookie
         yield  Request(
             url = 'https://dig.chouti.com/login' ,
             method = 'POST' ,
             headers = { 'content-type' 'application/x-www-form-urlencoded; charset=UTF-8' ,
                      'user-agent' 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' },
             cookies = self .cookies,
             callback = self .check_login,
             # 这里的body类似于requests的data,但是形式不一样,body不能够以字典的形式提交
             # 账号密码输入的对的,这里隐藏了
             body = 'phone=8618xxxxx2459&password=zxxxxxhyyxx&oneMonth=1'
         )
 
     # 回调函数,用于检测请求是否发送成功。
     # 注意回调函数不能是self.parse,否则回调执行的时候又把请求发过去了
     # 里面自动封装了response,就是我们执行成功之后的响应结果
     def  check_login( self , response):
         print (response.text)
         '''
         {"result":{"code":"9999", "message":"", "data":{"complateReg":"0","destJid":"cdu_53059370687"}}}
         '''
         # 登陆成功
 
         # 接下来进行点赞。
         # 登陆页面不需要cookie
         # 依旧yield
         yield  Request(
             url = 'https://dig.chouti.com/' ,
             callback = self .like,   # 定义一个用于点赞的回调函数
         )
 
 
     def  like( self , response):
         # 此时的response则是整个页面
         id_list  =  response.xpath( '//div[@share-linkid]/@share-linkid' ).extract()
         for  nid  in  id_list:
             url  =  'https://dig.chouti.com/link/vote?linksId=%s'  %  nid
             yield  Request(
                 url = url,
                 method = 'POST' ,
                 cookies = self .cookies,
                 headers = { 'referer' 'https://dig.chouti.com/' },
                 # 再加一个回调函数,查看是否点赞成功
                 callback = self .show_like
             )
    
 
     def  show_like( self , response):
         print (response.text)
 
        

  



执行成功response.text就会返回该结果

{"result":{"code":"9999", "message":"推荐成功", "data":{"jid":"cdu_53059370687","likedTime":"1530598017650000","lvCount":"24","nick":"古明地盆","uvCount
":"2921","voteTime":"小于1分钟前"}}}
{"result":{"code":"9999", "message":"推荐成功", "data":{"jid":"cdu_53059370687","likedTime":"1530598017657000","lvCount":"34","nick":"古明地盆","uvCount
":"2921","voteTime":"小于1分钟前"}}}

如果点赞成功之后继续执行,就会有如下提示

{"result":{"code":"30010", "message":"你已经推荐过了", "data":""}}

 

 

 

 

 会发现,我只给当前页进行了点赞,如果我想给好多页进行点赞呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
# -*- coding: utf-8 -*-
import  scrapy
from  scrapy.http  import  Request
 
# 我们如果要模拟登陆,就必须要拿到cookie
# response里面有url,text等等,但遗憾的是不想requests,可以直接拿到cookie
# 但我们可以导入一个模块
from  scrapy.http.cookies  import  CookieJar
 
 
class  GetChoutiSpider(scrapy.Spider):
     name  =  'get_chouti'
     allowed_domains  =  [ 'chouti.com' ]
     start_urls  =  [ 'https://dig.chouti.com/' ]
     cookies  =  None
 
     def  parse( self , response):
         # 此时只是拿到了一个存储cookie的容器
         cookie_obj  =  CookieJar()
 
         # response表示请求的所有内容,response.request表示我们发的请求
         # 接受我们上面说的两个参数
         cookie_obj.extract_cookies(response, response.request)
 
         # 那么此时的cookie_obj便保存了我们的cookie信息
         print (cookie_obj._cookies)
 
         '''
                 {'.chouti.com': {'/': {'gpsd': Cookie(version=0, name='gpsd', value='1c61978d6bb94989674386b29f2fd15d', port=None, port_specified=False, domain='.chouti
         .com', domain_specified=True, domain_initial_dot=False, path='/', path_specified=True, secure=False, expires=1533183431, discard=False, comment=None, co
         mment_url=None, rest={}, rfc2109=False)}}, 'dig.chouti.com': {'/': {'JSESSIONID': Cookie(version=0, name='JSESSIONID', value='aaaouDhGaca3Ugddzblrw', po
         rt=None, port_specified=False, domain='dig.chouti.com', domain_specified=False, domain_initial_dot=False, path='/', path_specified=True, secure=False, e
         xpires=None, discard=True, comment=None, comment_url=None, rest={}, rfc2109=False)}}}
                 '''
         # 上面便是我们获取的cookie信息
 
         # 将cookie保存起来
         self .cookies  =  cookie_obj._cookies
 
         # 同理request也一样
         '''
         类似于requests
         res = requests.get(xxxxx)
         res.cookies._cookies便是返回的cookie信息
         '''
 
         # 然后就要模拟登陆了,带上用户名和密码和cookie
         yield  Request(
             url = 'https://dig.chouti.com/login' ,
             method = 'POST' ,
             headers = { 'content-type' 'application/x-www-form-urlencoded; charset=UTF-8' ,
                      'user-agent' 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.99 Safari/537.36' },
             cookies = self .cookies,
             callback = self .check_login,
             # 这里的body类似于requests的data,但是形式不一样,body不能够以字典的形式提交
             # 账号密码输入的对的,这里隐藏了
             body = 'phone=8618xxxxx2459&password=zxxxxxhyyxx&oneMonth=1'
         )
 
     # 回调函数,用于检测请求是否发送成功。
     # 注意回调函数不能是self.parse,否则回调执行的时候又把请求发过去了
     # 里面自动封装了response,就是我们执行成功之后的响应结果
     def  check_login( self , response):
         print (response.text)
         '''
         {"result":{"code":"9999", "message":"", "data":{"complateReg":"0","destJid":"cdu_53059370687"}}}
         '''
         # 登陆成功
 
         # 接下来进行点赞。
         # 登陆页面不需要cookie
         # 依旧yield
         yield  Request(
             url = 'https://dig.chouti.com/' ,
             callback = self .like,   # 定义一个用于点赞的回调函数
         )
 
 
     def  like( self , response):
         # 此时的response则是整个页面
         id_list  =  response.xpath( '//div[@share-linkid]/@share-linkid' ).extract()
         for  nid  in  id_list:
             url  =  'https://dig.chouti.com/link/vote?linksId=%s'  %  nid
             yield  Request(
                 url = url,
                 method = 'POST' ,
                 cookies = self .cookies,
                 headers = { 'referer' 'https://dig.chouti.com/' },
                 # 再加一个回调函数,查看是否点赞成功
                 callback = self .show_like
             )
         # 此时点赞只是当前页,点赞,如果我想给每一页都点赞
         # 想给多页点赞,找到对应的页码
         pages  =  response.xpath( '//div[@id="dig_lcpage"]//a/@href' ).extract()
         for  page  in  pages:
             page_url  =  'https://dig.chouti.com%s'  %  page
             yield  Request(
                 url = page_url,
                 # 注意这里的callback,是函数本身
                 # 这里找到所有的页码,比如page_url此时处于第二页
                 # 那么再调用自己,就会给第二页点赞,点完赞之后,page_url就会变成第三页
                 # 那么再调用自己,就会给第三页点赞,以此往复
                 callback = self .like
                 # 抽屉貌似有一百二十多页,我们这里指定以下递归的深度,只爬取四个深度
             )
 
     def  show_like( self , response):
         print (response.text)

  





  

第七页也被点赞了

 

 第十页也被点赞了

 

既然如此,就玩一个疯狂的,给所有页面都点赞

将settings里面的DEPTH_LIMIT=4改成DEPTH_LIMIT=0,等于零表示无限查找

 

可以看到,一共120页,全点上了赞

转载于:https://www.cnblogs.com/aili10000/p/9294339.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值