2.2 urllib模块、超时设置、自动模拟http请求之get方法和post方法

“简说Python”,选择“置顶/星标公众号”

福利干货,第一时间送达!

640?wx_fmt=jpeg

阅读本文大约分7钟,实战知识,老表建议你反复看,反复记,反复练。

//

本文作者

王豪行路难,多歧路,今安在,埋头苦改bug会有时,直到bug改完才吃饭

//

1.urllib基础

  • urlretrieve(“网址”, "本地文件存储地址")方法,用来将文件下载到指定路径

  • urlcleanup()方法,用来清除内存中爬取的网页内容

  • urlopen()方法,用来爬取网页信息

  • info()方法,看爬取的网页的简介信息

  • getcode()方法,用来返回网页爬取的状态码,如果返回200表示处于爬取状态,反之,不处于

  • geturl()方法,用来获取当前访问的网页的url

eg:

import urllib.request,re

sock = urllib.request.urlopen("https://www.baidu.com/")
data = sock.read().decode("utf-8")
urllib.request.urlretrieve("https://www.baidu.com/", "D:\\python\\1.html")
urllib.request.urlcleanup()
print(sock.info())
print(sock.getcode())
print(sock.geturl)
sock.close()

2.超时设置

说明:有的网站能很快的被访问,有的访问很慢,因此,通过超时设置,合理分配时间,能够增加我们爬取网页信息的效率。

import urllib.request,re

#语法:超时设置就是在urlopen()方法中多加一个timeout参数,所接的数字是几秒响应
sock = urllib.request.urlopen("https://www.baidu.com/", timeout=0.1)

#通常超时设置与异常处理一起用
for i in range(1, 100):
    try:
        data = urllib.request.urlopen("https://www.baidu.com/", timeout=0.1).read().decode("utf-8")
        print(len(data))
    except Exception as err:
        print("网页响应超时!")

3.自动模拟http请求之get方法和post方法

(1) get方法自动请求方式实现自动爬取网页信息

说明:如何爬取搜索引擎中多页信息。

640?wx_fmt=png 搜索python

②切换页码,观察每页网址的共同点
640?wx_fmt=png 页码

③我将前三页的网址放在了一起,容易观察到红色方框内是相同的,其中 q=python中的 python就是我们搜索的内容,称为关键字,而 pn=1中的 1代表的是第几页。
640?wx_fmt=png 网址

④知道了 pn=1的含义,那么我们可以更改 pn=的值,来切换页面,从而访问前10页网页信息。这里我们要爬取的信息是每页下方的相关搜索内容。
2.2 urllib模块、超时设置、自动模拟http请求之get方法和post方法_第1张图片 相关搜索

⑤在要爬取的网页中点击鼠标右键,点击“查看网页源代码”,然后按 ctrl + f出来搜索款,搜索你要获取的内容。
2.2 urllib模块、超时设置、自动模拟http请求之get方法和post方法_第2张图片 搜索框

⑥多搜几个,发现规律,都是这个模式 data-source="2">python官方文档,只是数字为2或3或4。因此,我们的正则表达式可以为为 data-source="[234]">(.*?)
⑦编写代码,代码如下:
#简单爬虫编写,自动爬取网页信息
import urllib.request,re

keywd = "python"
#如果关键字是汉字,则需要对汉字进行转码,因为浏览器不能识别汉字
keywd = urllib.request.quote(keywd)        #对关键字进行编码,若不是汉字则可以省略这一步
for i in range(1, 11):
    url = "https://www.so.com/s?q=" + keywd + "&pn=" + str(i)
    data = urllib.request.urlopen(url).read().decode("utf-8")
    pat = 'data-source="[234]">(.*?)'
    res = re.compile(pat).findall(data)
    for x in res:
        print(x)

#结果太长,这里我给出小部分答案:
Python
python官方文档
python教学
python学习
python官网
python发音
Python官网
python是什么
python下载
python例子练手
python3
python能做什么
Python

(2) post方法自动请求方式实现自动爬取网页信息

说明:有的网页是需要用户填写并提交一些信息后才显示出来的,这种情况,我们用post方法来进行自动爬取网页信息。name属性,比如:

2.2 urllib模块、超时设置、自动模拟http请求之get方法和post方法_第3张图片
可以看见 name所对应的值就是所提交的post请求的关键,所以,我们可以通过代码模拟出post请求,从而获得信息。
代码如下:
import urllib.request
import urllib.parse     #要导入该模块

post_url = 'http://www.iqianyue.com/mypost'
post_data = urllib.parse.urlencode({'name':'asdasd', 'pass':'1123'}).encode("utf-8")
url = urllib.request.Request(post_url, post_data)
data = urllib.request.urlopen(url).read().decode('utf-8')
print(data)

#结果:


Post Test Page




name:
passwd:
you input name is:asdasd
you input passwd is:1123

总结:

  • get方法就是在爬取信息之前,用关键字和页码数对网址进行处理,再进行信息爬取

  • post方法是在爬取信息之前,创建dict,再用dict模拟请求,从而得到真实网址,再进行信息爬取

我是老表,踏实的人更容易过好生活,本文完。

推荐阅读:

数据分析从零开始实战

仔细阅读下面四篇文章,快速掌握Python基础知识要点

完整Python基础知识

我是老表,支持我请转发分享本文


/你学Python的态度/

留言 Python666 或 我爱Python,表明你的学习态度。

点个在看,表明态度↓↓↓

你可能感兴趣的:(2.2 urllib模块、超时设置、自动模拟http请求之get方法和post方法)