python学习之路(第六天)---爬虫详解

python学习之路(第六天)—爬虫详解

网页结构

首先要了解网页的结构,方便编写程序

这里以豆瓣电影首页为例https://movie.douban.com/

ctrl+U查看源码,其中有一些网页中出现的明文文字

image-20210821174029601

如上图网页结构一把由三部分组成,分别是html、css、javascript组成,在web课中由一定的了解

html

html是整个网站的结构,带有“<>”符号的都属于html的标签,并且都是成对出现,一个简单的例子:

<html>hello world</html>

image-20210821174534167

<html>..</html> 表示标记中间的元素是网页
<body>..</body> 表示用户可见的内容
<div>..</div> 表示框架
<p>..</p> 表示段落
<li>..</li>表示列表
<img>..</img>表示图片
<h1>..</h1>表示标题
<a href="">..</a>表示超链接

css

css表示样式,用来定义外观之类的

javascript

表示功能,网页中的一些特效,交互的功能等

合法爬取

网站基本上都有一个robots.txt,有的也没有,没有设定robots.txt的网站爬取所以界面,而有robots.txt就得根据文件中的目录来爬取,允许与不允许就一目了然了

image-20210821175447774

requests库的安装

这里使用的是pycharm,安装的话

image-20210821180137543

然后找到安装即可

image-20210821180425136

安装成功后会显示“Package ‘requests’ install susscessfully”

爬虫的基本原理

网页请求的过程分为两个环节:

1、请求(request):展示在我们眼前的网页都必须经过请求,也就是向服务器发起请求

2、响应(respose):服务器在接受到请求后,会进行验证,然后向用户发送响应的内容,客户端(用户)接收服务器响应的内容,然后将内容展示在我们眼前。

请求的方式也分为两种:

1、get请求:最常见的方式,一般用于获取或查询资源信息,也是大多数网站使用的响应方式

2、post请求:相比get,不同的是多了以表单的形式上传参数功能,除了查询信息之外还可以修改信息,事实上,登陆的时候发送的就是post请求。

使用GET方式抓取数据

例如这里的一个一周豆瓣电影的排行我要找的是怒火·重案这部电影,源码中也有明文形式,能搜索到,请求方式就是get

image-20210821181824126

请求对象就是豆瓣电影的首页网址 https://movie.douban.com/ 确定好请求对象之后,编写代码,requests库中是直接有get方法的

image-20210821182155086

应该是这个网站做了反爬,换一个,http://www.cntour.cn/

image-20210821194428227

可以成功爬取到源码

import requests        #导入requests包
url = 'http://www.cntour.cn/'
strhtml = requests.get(url)        #Get方式获取网页数据
print(strhtml.text)

使用POST方式抓取数据

F12在网络中寻找post方法

image-20210821225618820

这里用有道词典来演示post方法

点击翻译后找到翻译数据

image-20210821225854184

步骤如下图

image-20210821230119844

单击消息头,可以看到是post方式

image-20210821230224404

找到数据所在之处并且明确是post请求后开始编写代码

首先,将post头中的url复制出来,这里是要请求的地址,火狐浏览器点击重发一下就可以拦截到

事实上就是这一部分

image-20210821232227353

url =‘https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule’

不同于get的是,post请求必须构建请求头

表单数据(Form Data)如下图

image-20210821231619163

谷歌浏览器

image-20210821232404225

将其构建成一个字典:

From_data={'i':'爬虫','from':'AUTO','to':'AUTO','smartresult':'dict','client':'fanyideskweb','salt':'16295593183082','sign':'2320ebe8995c544f3f5b4b7abcf26160','lts':'1629559318308','bv':'e2a78ed30c66e16a857c5b6486a1d326','doctype':'json','version':'2.1','keyfrom':'fanyi.web','action':'FY_BY_REALTIME'}

然后使用post对应编写代码

# -*- coding: utf-8 -*-
import requests    
From_data = {'i': '爬虫', 'from': 'AUTO', 'to': 'AUTO', 'smartresult': 'dict', 'client': 'fanyideskweb',
                 'salt': '16295593183082', 'sign': '2320ebe8995c544f3f5b4b7abcf26160', 'lts': '1629559318308',
                 'bv': 'e2a78ed30c66e16a857c5b6486a1d326', 'doctype': 'json', 'version': '2.1', 'keyfrom': 'fanyi.web',
                 'action': 'FY_BY_REALTIME'}
url ='https://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule'
response = requests.post(url,data = From_data)
print(response.text)

得到了一个这样的结果,错误代码50

image-20210821234325609

但是事实上访问这个url得到的也是这个

image-20210821234416683

同样的编写思路,换个网站试试,嗯,换了个百度翻译。。。。

找了个最简单的表单,只有一个值

image-20210821235716029

相对应的url就是https://fanyi.baidu.com/langdetect

成功拿到数据

image-20210822000043190

与响应中一致

image-20210822000057819

# -*- coding: utf-8 -*-
import requests
From_data = {'query':'爬虫'}
url ='https://fanyi.baidu.com/langdetect'
response = requests.post(url,data = From_data)
print(response.text)

这样试一试其他的post请求

image-20210822001047843

运行后不报错但是没有数据输出

image-20210822001109395

不知道哪里出了问题,是有的数据不能爬取吗?

今天就学到这里了后续再继续学习吧。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值