python爬虫(2)——编写一个爬虫
一、URL的编码与解码
在python2中包含的urllib和urllib2,都是接受URL请求相关的模块。但是在python3中,却没有urllib2。实际上urllib2的功能在python3中可以用urllib来实现。
通常编码工作,我们使用urllib.parse.urlencode()函数,帮我们将key:value(类似于python的字典)这样的键值对转换成"key=value"这样的字符串,解码工作则可以用unquote()函数来实现。

一般的HTTP请求提交数据,需要编码成URL编码格式,然后作为URL的一部分,或者作为参数传到Request对象中。
二、写一个简单的爬虫程序
首先我们在cmder中用vim新建一个python文件,我们得目标是下载上海链家的二手房页面。
可以在浏览器中打开网站分析一下URL
第一页网址是:https://sh.lianjia.com/ershoufang/
第二页网址是:https://sh.lianjia.com/ershoufang/pg2/
第三页网址是:https://sh.lianjia.com/ershoufang/pg3/
............
当我们在https://sh.lianjia.com/ershoufang/后面加上"pg1/"时,发现也能得到第一页。可以根据这个规律来写这个爬虫。
from urllib import request
def HTMLspider(url,startPage,endPage):
#作用:负责处理URL,分配每个URL去发送请求
for page in range(startPage,endPage+1):
filename="第" + str(page) + "页.html"
#组合为完整的url
fullurl=url + str(page)
#调用loadPage()发送请求,获取HTML页面
html=loadPage(fullurl,filename)
#将获取到的HTML页面写入本地磁盘文件
writePage(html,filename)
def loadPage(fullurl,filename):
response=request.urlopen(fullurl)
return response.read()
def writePage(html,filename):
"""
将服务器的响应文件保存到本地磁盘
其中filename为本地磁盘文件名
"""
print("正在存储"+filename)
with open(filename,'wb') as f:
f.write(html)
print("--"*30)
if __name__=="__main__":
#输入需要下载的起始页和终止页,注意转换成int类型
startPage=int(input("请输入起始页:"))
endPage=int(input("请输入终止页:"))
url="https://sh.lianjia.com/ershoufang/"
HTMLspider(url,startPage,endPage)
print("下载完成!")


当然,这只是一个非常简单的下载页面的小爬虫。但是我们可以看到爬虫工作的基本过程。
三、关于GET请求和POST方法
GET请求一般用于我们向服务器获取数据,假如我们用百度搜索一个关键词,我们可以看到在请求部分,http://www.baidu.com/?之后出现一个长长的字符串,这就是包含了我们要查询的关键词,于是我们可以用默认的GET方式来发送请求。GET方式是直接以链接的形式访问的,链接中包含了所有参数。
而在发送POST请求时,需要特别注意headers的一些属性:content-length(表单数据长度),X-Requested-With:XMLHttpRequest(Ajax异步请求)等等。POST不会在网址上显示所有参数,服务器端用Requeste.Form获取提交的数据。
“对于一个爬虫工程师,我们必须关注爬虫的来源”
python爬虫(2)——编写一个爬虫的更多相关文章
- python练习:编写一个程序,要求用户输入10个整数,然后输出其中最大的奇数,如果用户没有输入奇数,则输出一个消息进行说明。
python练习:编写一个程序,要求用户输入10个整数,然后输出其中最大的奇数,如果用户没有输入奇数,则输出一个消息进行说明. 重难点:通过input函数输入的行消息为字符串格式,必须转换为整型,否则 ...
- python练习:编写一个程序,检查3个变量x,y,z,输出其中最大的奇数。如果其中没有奇数,就输出一个消息进行说明。
python练习:编写一个程序,检查3个变量x,y,z,输出其中最大的奇数.如果其中没有奇数,就输出一个消息进行说明. 笔者是只使用条件语句实行的.(if-else) 重难点:先把三个数进行由小到大的 ...
- python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False。
python练习:编写一个函数isIn,接受两个字符串作为参数,如果一个字符串是另一个字符串的一部分,返回True,否则返回False. 重难点:定义函数的方法.使用str类型的find()函数,可以 ...
- python练习:编写一个程序,要求用户输入一个整数,然后输出两个整数root和pwr,满足0<pwr<6,并且root**pwr等于用户输入的整数。如果不存在这样一对整数,则输入一条消息进行说明。
python练习:编写一个程序,要求用户输入一个整数,然后输出两个整数root和pwr,满足0<pwr<6,并且root**pwr等于用户输入的整数.如果不存在这样一对整数,则输入一条消息 ...
- Python网络编程——编写一个简单的回显客户端/服务器应用
今天将python中socket模块的基本API学习完后,照着书上的实例编写一个套接字服务器和客户端.采用python3.5版本,在注释中会标明python2和python3的不同之处. 1.代码 ( ...
- 从0开始的Python学习013编写一个Python脚本
通过之前的学习我们已经了解了Python的很多基础运用了,现在我们尝试着做一个有使用价值的小脚本. 问题 需求: 我想要一个可以给我备份重要文件的程序. 需求分析: 首先文件是有存储路径,文件的路径和 ...
- python练习笔记——编写一个装饰器,模拟登录的简单验证
编写一个装饰器,模拟登录的简单验证(至验证用户名和密码是否正确) 如果用户名为 root 密码为 123则正确,否则不正确.如果验证不通过则不执行被修饰函数 #编写一个装饰器,模拟登录的简单验证 #只 ...
- Python爬虫之编写一个可复用的下载模块
看用python写网络爬虫第一课之编写可复用的下载模块的视频,发现和<用Python写网络爬虫>一书很像,写了点笔记: #-*-coding:utf-8-*- import urllib2 ...
- 使用Beautiful Soup编写一个爬虫 系列随笔汇总
这几篇博文只是为了记录学习Beautiful Soup的过程,不仅方便自己以后查看,也许能帮到同样在学习这个技术的朋友.通过学习Beautiful Soup基础知识 完成了一个简单的爬虫服务:从all ...
随机推荐
- [国嵌攻略][090][linux网络编程模型]
编程模型 Socket的实质就是一个接口,利用该接口,用户在使用不同的网络协议时,操作函数得以统一.而针对不同协议的差异性操作,则交给了Socket去自行解决. TCP编程模型 UDP编程模型
- input[type=file]中使用ajaxSubmit来图片上传
今天在使用input[type=file]上传图片到服务器时,因为项目要求,并不是像常见的通过按钮来提交表单事件,而是图片上传后就自动执行表单提交事件,将上传的图片信息传给服务器. 刚开始我是这样执行 ...
- 如何开发由Create-React-App 引导的应用(三)
此文章是翻译How to develop apps bootstrapped with Create React App 官方文档 系列文章 如何开发由Create-React-App 引导的应用 如 ...
- vue-router自动判断左右翻页转场动画
前段时间做了一个移动端spa项目,技术基于 :vue + vue-router + vuex + mint-ui 因为使用了vue-cli脚手架的webpack模版,所有页面都以.vue为后缀的文件作 ...
- 怎么在谷歌浏览器中安装.crx扩展名的离线Chrome插件?
李宗申 2014-9-26 23:33:33 20人评论 分类:实用方法 摘要 : 如果用户得到的离线版的Chrome插件文件(扩展名为.crx),该如何将其安装到谷歌浏览器Chrome中去呢? ...
- Ajax常用实例
摘录自:http://www.cnblogs.com/gaopeng527/p/4459622.html 1. 级联下拉列表 例1.1 级联下拉列表. (1)编写AjaxRequest.js文件,并将 ...
- Aps.net中基于bootstrapt图片上传插件的应用
Aps.net中基于bootstrapt图片上传插件的应用 在最近的项目中需要使用一个图片上传的功能,而且是多张图片同时上传到服务器的文件夹中,将图片路径存放在数据库中.为了外观好看使用了bootst ...
- Laravel添加代码自动提示功能
在使用Laravel框架的时候,可能会碰上代码无法自动提示的情况,那么如何添加自动提示功能呢? 1,首先在composer.json中加入以下内容: "require": { &q ...
- webpack的四大核心概念
webpack中文文档:https://doc.webpack-china.org/concepts/ 一.Entry(入口) 1.单个入口(简写)语法 // 语法 entry: string|Arr ...
- 从arduino到32单片机的转型
#include "stm32f10x.h" #include "led.h" #include "delay.h" int main(vo ...