啊,摸索了半天,总算有点头绪了,由于对网页结构的不清晰,被折磨了好久。。。
最近就专门研究这个爬虫问题:
1.简单单页网页的爬取
2.翻页网页的爬取(商品,新闻类啊)
3.需要登陆网页的爬取
4.需要登陆加验证的网页爬取
5.scrapy 的框架问题
6.beautifulSoup、requests
7.cookeis、表单数据的查看
以上数据爬取之后,可以进行数据挖掘。
为防止网站被恶意访问,需要设置验证码登录,避免非人类的访问,Python爬虫实现验证码登录的原理则是先到登录页面将生成的验证码保存到本地,然后人为输入,包装后再POST给服务器。
此过程中涉及到了Cookie:
“Cookie”是小量信息,由网络服务器发送出来以存储在网络浏览器上,从而下次这位独一无二的访客又回到该网络服务器时,可从该浏览器读回此信息。这是很有用的,让浏览器记住这位访客的特定信息,如上次访问的位置、花费的时间或用户首选项(如样式表)。Cookie 是个存储在浏览器目录的文本文件,当浏览器运行时,存储在 RAM 中。一旦你从该网站或网络服务器退出,Cookie 也可存储在计算机的硬驱上。当访客结束其浏览器对话时,即终止的所有 Cookie。(百度百科)
其实Cookie保存在本地主机上,避免用户重复输入用户名和密码,在连接服务器的时候将访问连接和Cookie组装起来POST给服务器。这里涉及到了两次向服务器POST,一次是Cookie,这里还自行设计想要Cookie的内容,由于是要登录,Cookie中存放的则是用户名和密码。第二次POST则是向服务器提交验证。
8.查看器查看元素:
chorme:开发者模式,或F12,然后再网络里面
火狐也类似。
下面借鉴了网上的代码,然后稍稍的修改,模拟登陆加验证的网页爬取,豆瓣。
1 import re 2 import urllib.request # 下次利用requests库的话,要更简洁一些 3 import http.cookiejar 4 params = {} 5 params['form_email'] = input('请输入你的登陆密码(邮箱登陆):') 6 params['form_password'] = input('请输入密码:') 7 response = opener.open(loginurl, urllib.parse.urlencode(params).encode( 8 'utf-8')) # urllib.parse.urlencode(params).encode('utf-8') #这个是向服务 9 # 器POST的内容,可以打印一下response.geturl()请求的连接看一下 10 if response.geturl()[0:33] == 'https://accounts.douban.com/login': 11 html = response.read().decode('utf-8') 12 # print(html),可以先打印一下文件内容,为了看到网页元素更方便的写正则,可以复制下来,在需要获取的地方用(.+?)表示,然后用group()元组来取得, 13 # 验证图片地址 14 imgurl = re.search('<img id="captcha_image" src="(.+?)" alt="captcha" class="captcha_image"/>', html) 15 # imgurl即为验证图片,src= 验证图片的地址 16 if imgurl: 17 url = imgurl.group(1) # 即提取出了验证图片地址 18 # print(url) 19 # 将验证码以v.jpg保存在本地,在输入验证码的时候可以手工输入 20 res = urllib.request.urlretrieve(url, 'v.jpg') 21 # urlretrieve() 方法直接将远程数据下载到本地。urlretrieve(url, filename=None, reporthook=None, data=None) filename:文件保存地址 22 captcha = re.search('<input type="hidden" name="captcha-id" value="(.+?)"/>', html) 23 # print(captcha.group(1)) 24 if captcha: 25 vcode = input('请输入图片上的验证码:') 26 params["captcha-solution"] = vcode 27 params["captcha-id"] = captcha.group(1) # 这个是动态生成的,需要从网页中获得 28 params["user_login"] = "登录" 29 # 提交验证码验证 30 response = opener.open(loginurl, urllib.parse.urlencode(params).encode('utf-8')) 31 if response.geturl() == "https://www.douban.com/": 32 print("login sucess!") 33 else: 34 print('login lose!')
那么作为小白的我们该怎么判断,我们的爬虫已经登录成功了呢?
下面进行test一下:
1 # < span > (你的账号名)的帐号 < / span > ----> ture test:做测试 2 f = open('filepath', 'r+') 3 content = response.read() 4 f.write(content.decode()) # 这边记得解码一下,上面encode了。否则会报错 bety 不能写入 5 f.close() 6 a = '<span>(你的账号名)的帐号</span>' 7 a in content.decode() # 判断一下,有关于你的账号信息是不是可以读取出来。
# 思路:
1.手动登录页面
2.看源代码里面是否跟你爬下来的源代码一致即可
3.实质上只要检验一下你的账号信息有没有出现在源代码中就ok啦。
# 总结: 暂时还停留在粗浅的入门阶段,还有一些需要改进的地方,