zoukankan      html  css  js  c++  java
  • 项目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)
  • 相关阅读:
    第三章 操作符
    exit函数
    详解C++ friend关键字
    放假了,暂告一段落,迎接研究生
    使用const 提高函数的健壮性
    使用断言assert
    对return 语句的正确性和效率进行检查
    函数堆栈
    somethings about QSplitter
    引用和引用参数
  • 原文地址:https://www.cnblogs.com/yinwenjie/p/10861855.html
Copyright © 2011-2022 走看看