首先创建程序:
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)