首先打开豆瓣的网址:https://www.douban.com/, 然后可以发现登陆的界面,这里需要抓包分析fiddler,我找到的真实登陆网址是这个:https://accounts.douban.com/passport/login, 然后再db文件里面写了初始url,然后写了ua,
这个网址主要是说有验证码的爬取过程,但是现在不是图片验证码,而是移动缺口的验证方式,暂时运行失败了,先说一下视频的理解吧,之后有时间找别的网站尝试. 后来老师答疑的时候,说了这种移动缺口的一般可以扫描二维码登陆,然后把cookie记录下来就行了。具体怎么操作还没有做,之后有时间可以试试。
验证码处理方式包括半自动处理、打码平台接口、图片识别
今天是2019.5.26.刚刚尝试的微信爬虫没成功,但是不影响后续的学习。 豆瓣的爬取验证码变成了移动滑块,说这种可以尝试扫码登陆,但是具体怎么操作也没说。我也想对有验证码的继续研究一下,所以我自行换了一个微博登陆,我来试试。
cd E:\FHLAZ\Python37\Anaconda3\scrapy_document\first\第7次课 scrapy startproject weibo cd .\weibo\ scrapy genspider -t basic wb weibo.com #https://www.douban.com/ scrapy crawl wb --nolog目标:首先要微博登陆。先找到微博登陆地址 https://login.sina.com.cn/signup/signin.php?entry=sso
登陆时post请求,而不是get请求。
现在回到pycharm里面,先写wb.py文件。先设置url,然后找登陆字段。
我先写下没有验证码的登陆代码吧。
# -*- coding: utf-8 -*- import scrapy import urllib.request import re from scrapy.http import Request,FormRequest #FormRequest 相对应服务器发送请求 class WbSpider(scrapy.Spider): name = 'wb' allowed_domains = ['sina.com.cn'] ''' start_urls = ['http://weibo.com/'] ''' header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"} def start_requests(self): return [Request("https://login.sina.com.cn/signup/signin.php?entry=sso",callback=self.parse,meta={"cookiejar":1})] #Request第一个参数登陆url,callback回调函数,第三个是cookiejar,需要是开启的,可以加上一个meta,cookiejar设置为1 就是开启了,如果没有cookiejar,下次登陆可能就不行了。 def parse(self, response): ''' pat='<script src="(.*?)">' captcha=response.xpath('/html/body/script[1]/@src').extract()#这里可以提取验证码的链接,但是微博的我没有找到,我找到一个网址,这个网址里面有,但是不好提取。假设这个就是我要的验证码链接 url="https://login.sina.com.cn/signup/signin.php?entry=sso" if len(captcha)>0: print("此时有验证码") localpath="F:/pic/captcha.png" urllib.request.urlretrieve(captcha[0],filename=localpath) print("请登录查看本地验证码图片") ''' print("此时没有验证码") data = { "username": "……", "password": "……", } #也可以设置登陆后返回的网址redir:“”但是我没有找到,所以就没写了 print("登陆中……") #print(captcha) print(response) return [FormRequest.from_response(response, meta={"cookiejar":response.meta["cookiejar"]}, headers=self.header, formdata=data, callback=self.next, )] def next(self, response): print("此时已经登陆完成爬取首页的") title=response.xpath('//p[@class="me_name"]/text()').extract() print(title)最开始代码里面的allowed_domains是weibo.com,然后出错了,我查了这个的解决方法,https://blog.csdn.net/feifly329/article/details/49702063,然后我改成了sina.com.cn
基础的ok了,但是没有爬取内容。
通过print(response.text)可以查看爬取的内容,但是我发现还是没有登陆成功的界面内容.这个时候应该是微博没有登陆成功。
后续需要验证码部分就是写了一个验证码的网址,然后把图片下载到本地,然后手动输入验证码爬取。 但是找验证码的链接除了问题。微博登陆暂时还没有成功,我之后再回来尝试。 先把正常情况下的代码记载下来吧
# -*- coding: utf-8 -*- import scrapy import urllib.request import re from scrapy.http import Request,FormRequest #FormRequest 相对应服务器发送请求 class WbSpider(scrapy.Spider): name = 'wb' allowed_domains = ['sina.com.cn'] ''' start_urls = ['http://weibo.com/'] ''' header = {"User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36"} def start_requests(self): return [Request("https://login.sina.com.cn/signup/signin.php?entry=sso",callback=self.parse,meta={"cookiejar":1})] #Request第一个参数登陆url,callback回调函数,第三个是cookiejar,需要是开启的,可以加上一个meta,cookiejar设置为1 就是开启了,如果没有cookiejar,下次登陆可能就不行了。 def parse(self, response): captcha=response.xpath('/html/body/script[1]/@src').extract()#这里可以提取验证码的链接,但是微博的我没有找到,我找到一个网址,这个网址里面有,但是不好提取。假设这个就是我要的验证码链接 url="https://login.sina.com.cn/signup/signin.php?entry=sso" if len(captcha)>0: print("此时有验证码") localpath="F:/pic/captcha.png" urllib.request.urlretrieve(captcha[0],filename=localpath) print("请登录查看本地验证码图片并输入验证码") captcha_value=input() data = { "username": "……", "password": "……", "door": "captcha_value", } else: print("此时没有验证码") data = { "username": "……", "password": "……", "door": "captcha_value" } #也可以设置登陆后返回的网址redir:“”但是我没有找到,所以就没写了 print("登陆中……") #print(captcha) #print(response) return [FormRequest.from_response(response, meta={"cookiejar":response.meta["cookiejar"]}, headers=self.header, formdata=data, callback=self.next, )] def next(self, response): print("此时已经登陆完成爬取首页的") title=response.xpath('//p[@class="me_name"]/text()').extract() print(response.text) print(title)半自动验证码我还可以找找别的需要验证码登陆的尝试下。
暂时先继续视频学习把,看看后面有没有新的解决方法。