啊,摸索了半天,总算有点头绪了,因为对网页结构的不清晰,被折磨了很久。。。html
最近就专门研究这个爬虫问题: 浏览器
1.简单单页网页的爬取服务器
2.翻页网页的爬取(商品,新闻类啊)cookie
3.须要登录网页的爬取网络
4.须要登录加验证的网页爬取框架
5.scrapy 的框架问题scrapy
6.beautifulSoup、requests测试
7.cookeis、表单数据的查看网站
以上数据爬取以后,能够进行数据挖掘。url
为防止网站被恶意访问,须要设置验证码登陆,避免非人类的访问,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啦。
# 总结: 暂时还停留在粗浅的入门阶段,还有一些须要改进的地方,