项目3 scrapy实现抽屉自动点赞

首先创建程序:

1 scrapy startproject chouti
2 
3 cd chouti
4 scrapy genspider chouti_vote chouti.com

 

自定义起始请求处理:

 1 class LoginSpider(scrapy.Spider):
 2     name = 'chouti_vote'
 3     allowed_domains = ['chouti.com']
 4     start_urls = ['http://dig.chouti.com/']
 5     cookie_dict = {}   #用来保存第一次访问首页时返回的cookie值
 6 
 7     def start_requests(self):
 8         #自定义起始请求的处理
 9         for url in self.start_urls:
10             yield Request(url=url,callback=self.login)

注意:抽屉的cookie获取和一般网站不太一样,一般网站是在登陆时返回一个cookie,以后的请求都需要带着这个cookie,但是抽屉在登陆时返回的cookie只是一个没用的值,真正的cookie是在第一次访问首页时返回的。

注意:需要把settings中的ROBOT_OBRY改成False,不遵循协议,否则什么都获取不到

 

获取第一次访问返回的cookie,并登陆

 1     def login(self, response):
 2         # 获取访问首页时返回的cookies
 3         cookie_jar = CookieJar()
 4         cookie_jar.extract_cookies(response, response.request)
 5         for k, v in cookie_jar._cookies.items():
 6             for i, j in v.items():
 7                 for m, n in j.items():
 8                     self.cookie_dict[m] = n.value
 9 
10         yield Request(
11             url="https://dig.chouti.com/login",
12             method="POST",
13             headers={
14                 "User=Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
15                 "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
16             },
17             body="phone=8613658643870&password=ywj971020&oneMont=1",
18             cookies=self.cookie_dict,
19             callback=self.check_login
20         )

 

检查登陆是否成功,如果成功则再次访问首页。

注意:这次访问首页的Request对象需要添加dont_filter=True,因为scrapy会自动去重,而这个项目已经访问过一次首页,所以需要去掉这个功能。

 1     def check_login(self, response):
 2         #检查是否登陆成功
 3         if '"code":"21101", "message":"手机号或密码错误"' in response.text:
 4             print("用户名或密码错误")
 5         elif '"code":"9999"' in response.text:
 6             yield Request(
 7                 url="https://dig.chouti.com/",
 8                 headers={
 9                     "User=Agent": "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/71.0.3578.98 Safari/537.36",
10                     "Content-Type": "application/x-www-form-urlencoded; charset=UTF-8",
11                 },
12                 cookies=self.cookie_dict,
13                 dont_filter=True,  #不要去重,因为一开始已经访问过首页,scrapy会自动去重
14                 callback=self.find_id
15             )

 

找到当前页所有标签依次点赞,并获取所有分页的url依次访问

 1     def find_id(self, response):
 2         #找到所有新闻的ID
 3         item_list = response.xpath('//div[@id="content-list"]/div[@class="item"]')
 4         for item in item_list:
 5             share_linkid = item.xpath('.//div[@class="part2"]/@share-linkid').extract_first()
 6             yield Request(
 7                 url="https://dig.chouti.com/link/vote?linksId={0}".format(share_linkid),
 8                 method="POST",
 9                 cookies=self.cookie_dict,
10                 callback=self.check_vote
11             )
12 
13         #访问所有分页,依次点赞
14         url_list = response.xpath('//*[@id="dig_lcpage"]/ul/li/a[@href]/@href').extract()
15         for url in url_list:
16             url = "https://dig.chouti.com" + url
17             yield Request(
18                 url=url,
19                 callback=self.find_id
20             )
21 
22 
24     def check_vote(self, response):
25         print(response.text)

 

posted @ 2019-05-14 14:07  不可思议的猪  阅读(239)  评论(0编辑  收藏  举报