我学python3 爬虫之登录网站

news/2024/5/9 14:59:36/文章来源:https://blog.csdn.net/chu4755/article/details/100590336

        一直对编程感兴趣,但始终敬而远之,仅了解过一些皮毛。去年年底戒掉游戏,就突发奇想,认真学一门语言。问了一下度娘,说非科班出生比较适合学Python。因为之前对Python一点不了解,在网上搜了一些资料看,觉得挺有意思,就开始学。先是在手机上看网上的教程,主要看了菜鸟教程和廖雪峰老师关于Python的教程,学到一些基础,越发感兴趣。尤其是在工作中,偶然开窍解决一些小问题,觉得很有成就感,就想要深入系统的学一学。下定决心后,到书店买了几本书,因为刚开始不懂,就胡乱选了一些,有python基础的,数据分析的,教写网站的。混乱看了后,觉得不得法,加之有些浮躁,成效不太明显。总结了一下,觉得应该选一个研究方向,有重点的推进,而不应该眉毛胡子一把抓,结果什么都学不到。又是一阵问度娘,决定从数据分析方面入手,感觉大数据近年炒得有点火,而且感觉从数据分析入手,以后可以自己研究一些东西(比如出个报告什么的,有点想得美☺),有点像自由职业,应该是我将来想追求的。选定数据分析的方向后,就觉得应该从数据挖掘、数据采集等方面入手,因此首先想到的就是先学爬虫技术。不得不说,随着学习的逐渐深入,越发感觉自己欠缺的东西太多。比如爬虫,因为需要,就大致了解了http协议、html、正则表达式、cookie、网络抓包等好的东西,不得不服老啊,脑子不够用,学起来很慢。清明小长假,朋友圈到处是晒吃喝玩乐的照片,我除了陪孩子出去骑了半天的车,一直窝在家里捣鼓代码,攻克网站登录的难关。假期即将结束的时候基本摸清了头绪,算是假日成果吧。下面谈谈我的艰苦攻坚历程:

一、抓取网页的基本方法

要抓网页,基础的要用到urllib.request这个库,就这个库刚开始还是绕了一些弯路的。网上很多代码都是基于python2的,看了一些教程,也一直认为在python3中也是用urllib 和urllib2,遇到问题后才发现python2中的这两个库在pyhon3中被完全集成到urlllib.request这个库中。

抓网页是这样的,先拿度娘练练手:       

import urllib.request
url = 'http://www.baidu.com'web_response = urllib.request.urllopen(url)
web_content = web_response.read()
print(web_content.decode('utf8'))

也可以把抓取下来的网页内容写入文件:

with open('baidu.html', 'wb') as f:f.write(web_content)

以上代码更规范(或者说推荐)的应该是这样写的:

​import urllib.request
url = 'http://www.baidu.com'web_request = urllib.request.Request(url)
web_response = urllib.request.urllopen(web_request)
web_content = web_response.read()
print(web_content.decode('utf8'))

刚开始我也觉得这样写多余,何必先定义request呢?其实后面才知道,一方面,这样更能反应浏览器与服务器请求与应答的过程,使用urllib.request.Request()定义请求,在python标准库中,它的完整定义是这样的:

class urllib.request.Request(url, data=None, headers={}, origin_req_host=None, unverifiable=False, method=None)

其中的名称参数data和headers分别用与在请求中发送post数据和request头数据,后面模拟浏览器登录会用到。

而urllib.request.urlopen的完整定义是这样的:

urllib.request.urlopen(url, data=None, [timeout, ]*, cafile=None, capath=None, cadefault=False, context=None)

官方文档说:url可以是网址(string),也可以是一个Request对象,就是用urllib.request.Request对象

在成功抓取百度首页后,我曾经惊喜的认为抓取网页如此简单,无非是用正则表达式找出说抓取页面中需要的内容(数据),该下载的下载,该解析的解析,该继续抓的继续抓(指从页面中解析出的网址)无非是多一些循环和递归。很快,我就意识到我错了,这还差得远啊。很多网站要通过请求数据判断客服端究竟是不是web浏览器,如果不是就拒绝响应。这时,我们要通过定义并发送headers数据,把我们的程序请求伪装成浏览器(假装是浏览器在向服务器请求),最简单的定义是这样的一个字典(只有User-Agent一项):

headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36',
}

这在chrome的开发者工具中可以看见,如下图:

224343_7muL_3406045.png

然后,

web_request = urllib.request.Request(url, headers = headers)

这样服务器就会以为我们的请求是从浏览器操作的,就会给出响应。当然,有的header会需要很多项,这我还没有深入研究。但我认为,从chrome开发者工具中,把request header 的所有数据项复制过来应该不会差太远。

二、登陆网页

抓完百度首页,我就想抓知乎试试,结果碰壁,知乎需要登陆,如果不登陆,抓下来的页面什么都没有。我在网上找资料,其中一篇正好以登陆知乎为例的标题是:零基础自学用Python 3开发网络爬虫(四): 登录,原址为:http://python.jobbole.com/77878/,在此贴出程序代码:

import gzip
import re
import http.cookiejar
import urllib.request
import urllib.parsedef ungzip(data):try:        # 尝试解压print('正在解压.....')data = gzip.decompress(data)print('解压完毕!')except:print('未经压缩, 无需解压')return datadef getXSRF(data):cer = re.compile('name=\"_xsrf\" value=\"(.*)\"', flags = 0)strlist = cer.findall(data)return strlist[0]def getOpener(head):# deal with the Cookiescj = http.cookiejar.CookieJar()pro = urllib.request.HTTPCookieProcessor(cj)opener = urllib.request.build_opener(pro)header = []for key, value in head.items():elem = (key, value)header.append(elem)opener.addheaders = headerreturn openerheader = {'Connection': 'Keep-Alive','Accept': 'text/html, application/xhtml+xml, */*','Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3','User-Agent': 'Mozilla/5.0 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko','Accept-Encoding': 'gzip, deflate','Host': 'www.zhihu.com','DNT': '1'
}url = 'http://www.zhihu.com/'
opener = getOpener(header)
op = opener.open(url)
data = op.read()
data = ungzip(data)     # 解压
_xsrf = getXSRF(data.decode())url += 'login'
id = '这里填你的知乎帐号'
password = '这里填你的知乎密码'
postDict = {'_xsrf':_xsrf,'email': id,'password': password,'rememberme': 'y'
}
postData = urllib.parse.urlencode(postDict).encode()
op = opener.open(url, postData)
data = op.read()
data = ungzip(data)print(data.decode())

讲的很好,我也照做了,由于现在知乎需要验证码,并不能成功。但我从该教程中学会了定义和发生post数据,即:

headers = {}
post_dict = {'_xsrf':_xsrf,'email': id,'password': password,'rememberme': 'y'
}
post_data = urllib.parse.urlencode(postDict).encode()
web_request = urllib.request.Request(url, post_data, headers)

同时,我也了解到登陆网站不仅需要发送用户名、密码,还有诸如“_xsrf”这样被原文作者称为“沙漠之舟”的数据,而且这个数据在知乎的名称是“_xsrf",在其他网站这几乎不可能一样,而且服务器发送的方式也不知道,知乎是通过首页把 _xsrf 生成发送给我们, 然后我们再把这个 _xsrf 发送给 /login 这个 url,我们可以从首页中提取它的值,但其它网站呢,应该是各不相同的。事实是,我试着用作者推荐的Fiddler 软件观察了几个网站,确实不一样,而且以我老年人的脑袋,确实想不出来要怎么获取这些值。如csdn,好像需要在request中传送一个名叫”lt“的值,但我一直没有找到。我用Fiddler观察了接近一天,全无所获,一个网站也没有成功登陆,几乎到了崩溃的边缘。

在用chrome开发者工具观察request header数据的时候,我偶然发现其中有一项叫Cookie的值,于是我灵光一现,如果把这个cookie值写在header里面会怎么样呢?于是写出了一下代码:

import urllib.request
import gzip
import re
url = 'http://www.zhihu.com'
headers = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Encoding':'gzip, deflate, sdch, br','Accept-Language':'zh-CN,zh;q=0.8','Connection':'keep-alive','Cookie': '''此处省略一千字(实际的cookie值)''','Host':'www.zhihu.com','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36'
}
webrequest = urllib.request.Request(url, headers=headers)
webcontent_open = urllib.request.urlopen(webrequest).read()
webcontent = gzip.decompress(webcontent_open)
href_and_title_re = re.compile('<h2.*?href="(http.*?\d+)".*?>(.*?)</a></h2>')for href,title in href_and_title_re.findall(webcontent.decode('utf8')):print(title)print(href)

居然成功了!有图为证:

233339_ywON_3406045.png

我欣喜若狂,何不直接读取chrome目录下的Cookies写入header中,不久可以登陆了么?理想是丰满的,现实往往确实骨感的,在这个思路下我有经过了很多次折腾,才明白很多道理。老年人的脑袋是不够用啊!

三、通过读取Cookie

(未完待续,今天骑了半天的车太累了,年纪大了,扛不住,洗洗睡☺)

转载于:https://my.oschina.net/u/3406045/blog/873119

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.luyixian.cn/news_show_871245.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WordPress网站加载WAITING (TTFB) 时间过长解决办法

WordPress 刚刚安装的时候&#xff0c;性能是没问题的&#xff0c;我们安装了主题、插件、添加了一些小工具和菜单&#xff0c;然后我们就开始上传内容了&#xff0c;我们都很勤快 Waiting (TTFB) 时间 Time to First Byte 指的是浏览器开始收到服务器响应数据的时间&#xf…

网站运行缓慢的 12 个原因(以及如何修复它们)

如今用户希望网站速度快。当页面加载时间超过预期时&#xff0c;会对您网站的用户体验 (UX)产生负面影响。这很重要&#xff0c;因为每当您的用户体验受到影响时&#xff0c;您的转化率也会受到影响。您可能还会看到更高的页面放弃率和跳出率。额外的两秒加载时间可以将您网站的…

WordPress网站搬家换域名(数据迁移无丢失)

新站点 新域名 新数据库 利用插件2个步骤即可完成迁移替换等操作&#xff0c;算是和演示站克隆一样的效果&#xff0c;包括主题设置模板那些。百度上的WordPress迁移搬家教程方法都是千篇一律只管复制粘贴&#xff0c;不管情况是否一致正确可行&#xff0c;毫无人性可言。请各位…

谷歌广告联盟(Google Adsense)通过网站获利功能在线创收

Google作为全球最大搜索引擎&#xff0c;拥有全球近27亿用户的使用可以讲是最大的搜索引擎了。。可以说是国内某度没有办法比的。谷歌广告联盟(Google AdSense)门槛较高&#xff0c;一个用户只能申请一个谷歌账号&#xff0c;当你有了一个英文站之后最难的就是这个站的流量。 谷…

采集的网站如何做收录(采集站网站排名优化技巧)

采集站的主要工作是提升网站文章被百度的收录量&#xff0c;基本离不开文章组合工具,支持对词组、字句进行原创随机组合,做文章收录也并不难&#xff0c;只是需要一定的技巧。飓风算法之后采集站还能做吗&#xff1f;毫无疑问&#xff0c;当然可以。本人虽然不像一些大佬那么厉…

黑客是怎么攻击网站的(网站渗透入侵全部教程)

原标题《安全攻击溯源思路及案例》在攻防的视角里&#xff0c;进攻方会占据比较多的主动性&#xff0c;而防守方则略显被动&#xff0c;因为作为防守方&#xff0c;你永远也不知道攻击会在什么时候发生。你所能做的是&#xff0c;做好自己该做的一切&#xff0c;准备好自己该准…

12306铁道部订票网站瘫痪 技术惹的祸?

【IT168 评论】俗话说&#xff0c;新官上任三把火。铁道部掌门人易主&#xff0c;换来了中国铁路史上一个振奋人心的消息——网络实名购票&#xff0c;目标是解决中国铁路长期以来面临的“一票难求“的难题。受此影响&#xff0c;中国铁路订票官方网站12306.cn这个网络新生儿&a…

由12306.cn谈谈网站性能技术

12306.cn网站挂了&#xff0c;被全国人民骂了。我这两天也在思考这个事&#xff0c;我想以这个事来粗略地和大家讨论一下网站性能的问题。因为仓促&#xff0c;而且完全基于本人有限的经验和了解&#xff0c;所以&#xff0c;如果有什么问题还请大家一起讨论和指正。&#xff0…

这几个宝藏网站,一旦知道,你就离不开了!!!

谁说程序员只有代码&#xff1f; 今天就回归生活 为大家推荐几个鲜为人知的私藏小众网站&#xff0c;每一个都堪称日常神器 并且其中很多网站是完全免费的&#xff0c; 基本上都是非常良心好用&#xff0c;让你相见恨晚&#xff0c;用过就离不开。 有用的话记得分享给需要…

一篇从零开始、步骤完整的网站搭建教程(全篇7000字、102张截图说明,力求每一个人都能看懂,附源码)

从今年八月开始到现在自己也是从0开始做了有两个网站: 这中间也经常有不了解的地方需要去查。其实网上的资料也不少 但可能相对比较零散&#xff0c;需要反复的查来查去&#xff0c;费时又累心 那这次有时间就想着说写一篇从零开始、步骤完整的网站搭建教程 希望能帮助大家节省…

新手爬取51job,智联,boss网站职位信息总结和代码(小杜总结)

爬取要求&#xff1a; &#xff08;1&#xff09; 使用合适的数据保存手段保存爬取数据 &#xff08;2&#xff09; 记每条数据的爬取时间 &#xff08;3&#xff09; 实现数据的增量爬取 &#xff08;4&#xff09; 实现同时基于关键字和页面 URL 的去重元数据说明&#xff1a…

SEO必备工具—百度谷歌关键词采集工具(绿色版)

更多内容请到我的博客:http://mikameng.com 如果您做网站SEO优化&#xff0c; 想必您会经常和关键词打交道。 如果您想拥有海量的网站流量吗&#xff1f; 那采集海量的关键字是很有必要的。 如何快速&#xff0c;高效的获取百度和谷歌的海量关键词呢&#xff0c; 本人开发了…

MacOS解决访问百度很慢,但是其他网站正常的问题

话说这两天隔离结束回到公司宿舍&#xff0c;然后发现宿舍网过期了。。 充了钱之后发现其他设备访问百度都非常正常&#xff0c;但是唯独我的MacBook Pro访问百度巨慢。。 于是用搜狗搜了一下&#xff0c;发现可能是DNS的问题。。就跑到设置的网络这儿 然后在连接的网络里点…

Linux安装apache、发布网站、修改端口、配置第二顺位默认发布文件

1.安装apache服务器&#xff0c;并配置访问端口为9999。 安装apache yum install httpd -y 安装apache手册 yum install httpd-manual 将Apache服务添加到 开机自启中 systemctl start httpd systemctl enable httpd 设置永久允许http firewall-cmd --permanent --add-…

任选一小说网站,爬取任意一部小说,以记事本的形式保存。

1、任选一小说网站&#xff0c;爬取任意一部小说&#xff0c;以记事本的形式保存。 第一种情况(网址可能已失效)&#xff1a; import requests from lxml import etree def get_url():url http://www.yuetutu.com/cbook_24378/r requests.get(url)tree etree.HTML(r.text)…

使用AJAX技术,结合监听器,实现页面中动态显示当前网站在线人数(电子工业出版社《Java Web程序设计》P171第九题)

导航 先上思维图纸第一步&#xff1a; 参考了课本(如题教材)实现了Listener第二步&#xff1a;个性化适配第三步&#xff1a;实现JSP界面总体问题&#xff1a; 刚看到的时候心里想的是写一个Servlet集成Listener的相关接口实现。然后JSP的JS每1ms获取一次doGet()中的数据实时刷…

curl网站开发指南

来源&#xff1a;http://www.ruanyifeng.com/blog/2011/09/curl.html curl网站开发指南 作者&#xff1a; 阮一峰 我一向以为&#xff0c;curl只是一个编程用的函数库。 最近才发现&#xff0c;这个命令本身&#xff0c;就是一个无比有用的网站开发工具&#xff0c;请看我整理…

怎样用SharePoint创建网站?

SharePoint能够让企业开发出智能的门户站点&#xff0c;无缝连接用户、团队及信息。下面&#xff0c;我们就将教你如何在sharepoint中创建网站&#xff1a; 创建网站 2. 在 SharePoint 主页上选择“ 创建网站”。 3. 在向导中对网站属性进行基本设置&#xff0c;如网站类型、网…

Linux 安装apache ,发布网站修改端口和配置第二顺位默认发布文件

1.安装apache 软件和手册 2.发布网站&#xff0c;找到默认的发布目录 用xftp 链接上自己的主机传送需要发布的网站到/var/www/html 目录下 使用命令ls查看是否有文件上传 上传成功打开浏览器&#xff0c;输入主机名&#xff0c;查看是否发布成功 3.修改默认端口 #主配置目录 …