python实战——网络爬虫之request

Urllib库是python中的一个功能强大的,用于操做URL,并在做爬虫的时候经常要用到的库,在python2中,分为Urllib和Urllib2两个库,在python3之后就将两个库合并到Urllib库中,使用方法有所不同,我使用的是python3。

第一步,先导入Urllib库对应的模块,import urllib.request 或者直接导入request模块 from urllib import request

from urllib import request

file = request.urlopen("http://www.baidu.com")   #urlopen打开并爬取一个页面,并将值赋给file,以百度为例
data = file.read()                               #read()读取全部能容
dataline = file.readline()                       #readline()只读取一行

# 分别打印两个值
print(dataline)

print(data)

打印结果:

这样就将获取的网页的HTML代码爬取下来了

爬取到数据之后我们怎么将爬取的网页以网页的形式进行保存

from urllib import request

file = request.urlopen("http://www.baidu.com")
data = file.read()

fhandle = open("F:/爬虫/1.html","wb")  #通过open()函数打开该文件,“wb”以二进制写入形式打开,不会的话可以学习一下之前的python的文件写入操作。
                                       #文件目录自己先创建
fhandle.write(data)                    #将data数据写入到
fhandle.close()                        #将文件关闭

然后找到该文件,用浏览器打开

图片信息还未爬取,但至此我们已经网页爬取并保存。

还有一种直接使用request模块中的urlretrieve函数直接写入

格式:urlretrieve(url,filename=本地地址)

from urllib import request

filename=request.urlretrieve("http://www.qq.com",filename="F:/爬虫/2.html" )

然后查看保存的路径下的文件,打开之后

使用urlretrieve执行的过程中会产生一些缓存,可以使用函数urlcleanup()进行清除

还有写其他的常用的方法如下:

返回与当前环境有关的信息  info()

获取当前爬取网页的状态码  getcode()

获取当前爬取网页的URL地址  geturl()

由于URL标准中之允许一部分的ASCII字符,比如数字,字母,部分表单符号等,其他不符合标准的要进行编码,使用quote()

编码之后进行解码 unquote()

当然不是所有的网站都可以这么轻松的获取到,很多网站都进行了反爬虫设置,用浏览器可以打开但用爬虫爬不到,此时我们就需要设置一些headers信息,模拟成浏览器去访问这些网站。

首先打开浏览器,输入www.baidu.com 然后按F12  在刷新一下网页

点击网络就可以看到上面的图了,然后点击第一个和右边的按钮

你就可以看到这样的

右边的标头就是headers,然后找到User-Agent,这个就是我们要用到的模拟浏览器的信息,将其复制下来

我们可以得到该信息 “User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36”

这样我们就可以修改报头,其中request()下的build_opener()和request.Request()下的add_header()都可以进行操作,如下:

from urllib import request
url = "www.baidu.com"    #仅仅是个例子
headers = ("User-Agent","User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")
opener = request.build_opener()
opener.addheaders=[headers]
data = opener.open(url).read()
print(data)

还有一种方法是通过request.Request(url)方式进行操作如下:

from  urllib import request

urll = "http://www.baidu.com"
req = request.Request(urll)
req.add_header("User-Agent","User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")
#这里的键值对不止这一个,你也可以把所有的都写上,比如Cookie、host都可以
data = request.urlopen(req).read()
fhandle = open("F:/爬虫/1.html","wb")
fhandle.write(data)
fhandle.close()

HTTP请求之GET请求

当我们用百度进行搜索时会看到网络请求用的时get请求

可以看出搜索词的关键字时wd,这样我们可以通过构造类似的网址进行网络请求,然后再将请求的网址保存

from  urllib import request

keywd = "中国是一个伟大的国家"
key_code = request.quote(keywd)                 #汉字要编码,
urll = "http://www.baidu.com/s?wd="+key_code    #拼接字符串
req = request.Request(urll)
data = request.urlopen(req).read()
fhandle = open("F:/爬虫/3.html","wb")
fhandle.write(data)
fhandle.close()

然后打开本地保存的文件

从上面的示例中可以总结出,使用GET请求的思路如下:

1.构造对应的URL地址,该URL地址包含GET请求的字段名和字段内容的信息,并且URL满足GET请求的格式,即 “http://网址?字段1=字段内容1&字段2=字段内容2”。

2.以顶印度额URL为参数,构建Request对象。

3.通过urlopen()打开构建的Request对象。

4.按需求进行后续处理的操作,比如读取网页的内容、将内容写入文件等。

HTTP请求之POST请求

在注册和登陆网站是我们基本上都会遇到post请求,下面举个例子,这个是自己搭建的post请求网页,很粗糙的一个,只是将post请求的用户名个密码提交之后打印在了页面上。源码如下:

<form action="<?=$_SERVER[‘PHP_SELF‘] ?>" method="POST">
    用户名<input type="text" name="username"><br>
    密码<input type="password" name="passwd"><br>
    <input type="submit" name="submit" value="提交">
</form>

<?php
if (isset($_POST[‘submit‘])) {
    echo "<br>";
    echo ‘用户名:‘.$_POST[‘username‘]."<br>";
    echo "密码:".$_POST[‘passwd‘].‘<br>‘;
}
?>

原始的页面是

填写用户名和密码之后的页面

怎么构建post请求,一般的思路如下:

1.设置好URL网址

2.构建表单数据,并使用urllib.parse.urlencode对数据进行编码处理

3.创建Request对象,参数包括URL地址和要传递的编码处理

4.使用add_header()添加头部信息,模拟浏览器进行爬取

5.使用urllib.request.urlopen()打开对应的Request对象,完成信息的传递

6.读取或者写入等操作

现在我们去爬一下上面的网站:http://192.168.199.247/mytest/index.php

至于构建表单数据,我们需要看一下源码,打开网页,按F12,找到from表单的部分。

从上面我们可以看出需要提交表单的两个字段分别是:username、passwd。这样我们就可以构造数据,POST请求时的数据构造都要是以字典的形式进行所以我们构造的函数为:

{"username":"root","passwd":"root"},我们将用户名和密码都设置为root,这只完之后我们进行编码。然后创建Request对象之后就按着思路往下走就可以了

代码:

from  urllib import request
from urllib import parse      #编码时需要用到的库

url = "http://192.168.199.247/mytest/index.php"
postdata = parse.urlencode({
    "username":"root",
    "passwd":"root"
}).encode("utf-8")   #设置编码格式为utf-8
req = request.Request(url,postdata)  #在Request之后可以直接设置传递的数据  Request(url地址,传递的数据)
req.add_header("User-Agent","User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36")
data = request.urlopen(req).read()
fhandle = open("F:/爬虫/1.html","wb")
fhandle.write(data)
fhandle.close()

原文地址:https://www.cnblogs.com/abdm-989/p/12129010.html

时间: 2024-10-08 19:34:42

python实战——网络爬虫之request的相关文章

分享《Python 3网络爬虫开发实战》中文PDF+源代码

下载:https://pan.baidu.com/s/1S9PAGO0123_7Csz14z-e2g 更多资料分享:http://blog.51cto.com/3215120 <Python 3网络爬虫开发实战>中文PDF+源代码 中文版PDF,606页,带目录和书签,文字可以复制粘贴. 配套源代码: 经典书籍,讲解详细: 如图: 原文地址:http://blog.51cto.com/3215120/2312586

分享《Python 3网络爬虫开发实战》中文PDF+源代码+崔庆才

下载:https://pan.baidu.com/s/1XNJwYJRurKN1bScroixpYA更多资料分享:http://blog.51cto.com/14087171 <Python 3网络爬虫开发实战>中文PDF+源代码 中文版PDF,606页,带目录和书签,文字可以复制粘贴. 配套源代码: 经典书籍,讲解详细: 如图: 原文地址:http://blog.51cto.com/14087171/2321606

分享百度云链接 Python 3网络爬虫开发实战 ,崔庆才著

分享百度云链接 Python 3网络爬虫开发实战 ,崔庆才著 百度云链接: https://pan.baidu.com/s/1cIB7etdwh8_eybTiatDbQQ 原文地址:http://blog.51cto.com/11018611/2326618

《Python 3网络爬虫开发实战中文》超清PDF+源代码+书籍软件包

<Python 3网络爬虫开发实战中文>PDF+源代码+书籍软件包 下载: 链接:https://pan.baidu.com/s/18yqCr7i9x_vTazuMPzL23Q 提取码:i79n 本书书籍软件包为本人原创,在这个时间就是金钱的时代,有些软件下起来是很麻烦的,这个真的可以为你们节省很多时间.软件包包含了该书籍所需的所有软件.此文件大小为1.85G 这是一个非常ok,使下载速度到1.5MB左右这是一个百度网盘直链下载教程链接:http://www.360kuai.com/pc/9d

Python简单网络爬虫实战—下载论文名称,作者信息(下)

在Python简单网络爬虫实战—下载论文名称,作者信息(上)中,学会了get到网页内容以及在谷歌浏览器找到了需要提取的内容的数据结构,接下来记录我是如何找到所有author和title的 1.从soup中get到data类 soup中提供了select方法来筛选所需的类.该方法使用方法如下: articlename = soup.select('title') 该语句即将soup中所有的title元素放到articlename中.select也有其他用法 articlename = soup.s

Python 3网络爬虫开发实战书籍

Python 3网络爬虫开发实战书籍,教你学会如何用Python 3开发爬虫 本书介绍了如何利用Python 3开发网络爬虫,书中首先介绍了环境配置和基础知识,然后讨论了urllib.requests.正则表达式.Beautiful Soup.XPath.pyquery.数据存储.Ajax数据爬取等内容,接着通过多个案例介绍了不同场景下如何实现数据爬取,*后介绍了pyspider框架.Scrapy框架和分布式爬虫. 很多初学者,对Python的概念都是模糊不清的,Python能做什么,学的时候,

Python即时网络爬虫:API说明

API说明--下载gsExtractor内容提取器 1,接口名称下载内容提取器 2,接口说明如果您想编写一个网络爬虫程序,您会发现大部分时间耗费在调测网页内容提取规则上,不讲正则表达式的语法如何怪异,即便使用XPath,您也得逐个编写和调试.如果要从一个网页上提取很多字段,逐个调试XPath将是十分耗时的.通过这个接口,你可以直接获得一个调测好的提取器脚本程序,是标准的XSLT程序,您只需针对目标网页的DOM运行它,就能获得XML格式的结果,所有字段一次性获得. 这个XSLT提取器可以是您用MS

Python即时网络爬虫项目: 内容提取器的定义

1. 项目背景在python 即时网络爬虫项目启动说明中我们讨论一个数字:程序员浪费在调测内容提取规则上的时间,从而我们发起了这个项目,把程序员从繁琐的调测规则中解放出来,投入到更高端的数据处理工作中. 2. 解决方案为了解决这个问题,我们把影响通用性和工作效率的提取器隔离出来,描述了如下的数据处理流程图: 图中"可插拔提取器"必须很强的模块化,那么关键的接口有: 标准化的输入:以标准的HTML DOM对象为输入 标准化的内容提取:使用标准的xslt模板提取网页内容 标准化的输出:以标

Windows 环境下运用Python制作网络爬虫

import webbrowser as web import time import os i = 0 MAXNUM = 1 while i <= MAXNUM: web.open_new_tab('要刷的网络地址') os.system('taskkill /F /IM 浏览器文件名(chrome.exe)') i += 1 else: print 'happly day!' 代码和简单只要一个第三方的函数和调用系统的文件就OK了.记住给要刷的次数定值,不然电脑就不好受了! Windows