2、自动模拟登陆爬虫实战(失败)
E:\FHLAZ\Python37\Anaconda3\scrapy_document\first\第7次课
scrapy startproject douban
cd .\douban\
scrapy genspider -t basic db douban.com
#https://www.douban.com/
scrapy crawl db --nolog
首先打开豆瓣的网址: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)
半自动验证码我还可以找找别的需要验证码登陆的尝试下。
暂时先继续视频学习把,看看后面有没有新的解决方法。