Python爬虫urllib模块
Python爬虫练习(urllib模块)
关注公众号“轻松学编程”了解更多。
1、获取百度首页数据
流程:a.设置请求地址 b.设置请求时间 c.获取响应(对响应进行解码)
'''
获取百度首页
'''
import urllib
from urllib import request # urllib.request = urllib2
'''
url, 请求地址
data=None, get请求,当data不为空时则是post请求
timeout 请求时间
'''
# 获取请求数据
try:
# 设置请求时间为1秒,超时则抛出错误
response = urllib.request.urlopen('http://www.baidu.com',timeout=1)
print(type(response))
print(response.read().decode('utf-8'))
except Exception as e:
print(e)
#打印结果为<urlopen error timed out>
2、模拟百度接口
流程:a.对关键字编码 b.设置请求地址 c.设置请求体(请求地址、请求头) d.获取响应(对响应进行解码)
'''
模拟百度接口
'''
import urllib
from urllib import request,parse
def baiduAPI(kw):
'''
:param kw: 关键字
:return: response,内容是html
'''
# a.对关键字编码
# 将字典拼接成wd1=123&wd2=1234字符串,即在url中携带参数
kw = {"kw": kw}
wd = urllib.parse.urlencode(kw,encoding="utf-8",errors="ignore")
#解码
# kw = urllib.parse.unquote(wd,encoding="utf-8",errors="ignore")
# b.设置请求地址
url = "http://www.baidu.com/s?wd=" + wd
# 设置请求头
header = {
"User-Agent": '''Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'''
}
# c.设置请求体
req = urllib.request.Request(url,headers=header)
# d.获取响应
response = urllib.request.urlopen(req)
# 对响应进行解码
return response.read().decode("utf-8")
if __name__ == '__main__':
kw = input("请输入搜索关键字:")
response = baiduAPI(kw)
print(response)
注意:路由地址补全:
http://www.baidu.com/
https://www.baidu.com
否则有可能报错:
#请求地址不完整
raise HTTPError(req.full_url, code, msg, hdrs, fp)
urllib.error.HTTPError: HTTP Error 400: Bad Request
3、爬取豆瓣电影
流程:a.动态构建url b.设置请求体(请求地址、请求头) c.获取响应(对响应为json数据) d.解析json数据 e.把数据写入文件
打开豆瓣电影:https://movie.douban.com/ 找到“分类点击” f12(或右键选择检查)打开控制台调试器–>找到Newwork -->选中XHR -->刷新页面 -->查看响应的数据获取url -->把页面往下拖点击“获取更多” -->查看多出来的响应,对比其中的url差别。
import json
import urllib
from urllib import request
# 首页
# https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start=0
# 第二页
# https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start=20
# a.动态构建url b.设置请求体(请求地址、请求头)
# c.获取响应(对响应为json数据) d.解析json数据 e.把数据写入文件
def getDouBanMovieInfo(pageRange):
'''
获取豆瓣电影信息
:param pageRange:页码范围
:return: json数据
'''
# a.动态构建url
for i in range(pageRange):
# 一页20条数据
url = "https://movie.douban.com/j/new_search_subjects?sort=T&range=0,10&tags=&start=%d" %(i * 20)
# 设置请求头,模拟成是浏览器访问
header = {
"User-Agent": '''Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'''
}
# b.设置请求体(请求地址、请求头)
req = urllib.request.Request(url,headers=header)
# c.获取响应(对响应为json数据)
response = urllib.request.urlopen(req).read().decode("utf-8")
# d.解析json数据
mdata = json.loads(response)
data = mdata["data"]
# print(data)
for i in data:
# 明星
casts = i["casts"]
# 导演
directors = i["directors"]
# 电影名
title = i["title"]
# print(directors)
# e.把数据写入文件
with open("movie.txt","a+",encoding="utf-8",errors="ignore") as f:
item = "电影:"+title + " 导演:" + ",".join(directors) + " 演员:" + ",".join(casts)
f.write(item + "\n")
f.flush()
if __name__ == '__main__':
pageRange = int(input("输入页码范围:"))
# 读取1也数据
getDouBanMovieInfo(pageRange)
4、阿里招聘
流程:
1、获取相关岗位总页数
a.设置请求地址(种子) b.设置要提交的表单数据 c.获取响应(对响应为json数据) d.解析json数据 e.返回数据
2、获取相关岗位信息
a.设置请求地址 b.设置要提交的表单数据 c.设置请求体 d.获取响应(对响应为json数据) e.解析json数据 f.返回数据
import json
import urllib
from urllib import request,parse
def getTotalPage(kw):
'''
获取相关岗位总页数
:param kw: 搜索关键字
:return: int 总页数
'''
# a.设置请求地址(种子)
url = "https://job.alibaba.com/zhaopin/socialPositionList/doList.json"
# 设置请求头
header = {
"User-Agent": '''Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'''
}
# b.设置要提交的表单数据
data = {
"pageSize": "10",
"t": "0.6069253832315697",
"keyWord": kw,
"location": "",
"second": "",
"first": "",
"pageIndex": "1",
}
# 表单数据编码
data = urllib.parse.urlencode(data).encode("utf-8")
# 设置请求体
req = urllib.request.Request(url,data=data,headers=header)
# 获取响应
response = urllib.request.urlopen(req).read().decode("utf-8")
# d.转json
data = json.loads(response)
print(data)
return data["returnValue"]["totalPage"]
def getPosition(kw,totalPage):
'''
获取相关岗位数量
:param kw: 搜索关键字
:param totalPage: 总页数
:return:
'''
# pageIndex是从1开始
for i in range(1,totalPage + 1):
# a.设置请求地址
url = "https://job.alibaba.com/zhaopin/socialPositionList/doList.json"
# 设置请求头
header = {
"User-Agent": '''Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'''
}
# b.设置要提交的表单数据
data = {
"pageSize": "10",
"t": "0.6069253832315697",
"keyWord": kw,
"location": "",
"second": "",
"first": "",
"pageIndex": i,
}
# 表单数据编码
data = urllib.parse.urlencode(data).encode("utf-8")
# 设置请求体,POST请求
req = urllib.request.Request(url, data=data, headers=header)
# 获取响应
response = urllib.request.urlopen(req).read().decode("utf-8")
# d.转json
data = json.loads(response)
dataValue = data["returnValue"]["datas"]
for job in dataValue:
# 岗位名称
name = job["name"]
# # 要求
# requirement = job["requirement"]
# 学历
degree = job["degree"]
# # 描述
# description = job["description"]
# 工作经历
workExperience = job["workExperience"]
# print(name,requirement,degree,description,workExperience)
with open("joblist.txt","a+",encoding="utf-8") as f:
item = "岗位:" + name + " 学历:" + degree + " 工作经历:"+workExperience + "\n"
f.write(item)
f.flush()
if __name__ == '__main__':
# 查询岗位列表
jobList = ["python","java"]
# 获取职位总页数
for job in jobList:
totalPage = getTotalPage(job)
getPosition(job,totalPage)
5、12306
流程:
a.设置忽略安全证书 b.设置请求体(请求地址、请求头) c.获取响应(对响应进行解码)
import urllib
from urllib import request
import ssl
# a.设置忽略安全证书 b.设置请求体(请求地址、请求头) d.获取响应(对响应进行解码)
# 设置忽略安全证书
context = ssl._create_unverified_context()
url = "http://www.12306.cn/mormhweb/"
# 设置请求头,模拟成是浏览器访问
header = {
"User-Agent": '''Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'''
}
req = urllib.request.Request(url,headers=header)
response = urllib.request.urlopen(req,context=context).read().decode("utf-8")
print(response)
6、51job获取岗位数
流程:
a.设置正则匹配 b.对岗位进行utf-8编码 c.设置url d.设置请求体(请求地址、请求头) e.获取响应(对响应进行解码)
# 获取岗位数量
'''
<div class="rt">
共3500条职位
</div>
'''
import urllib
from urllib import request,parse
import re
# a.设置正则匹配 b.设置请求体(请求地址、请求头) d.获取响应(对响应进行解码)
# 设置正则匹配
jobNumRe = "共(\d+)条职位"
def getJobNum(job):
'''
获取职位数量
:param job: 职位
:return: int
'''
# 编码,空键
job = urllib.parse.urlencode({"":job})
url = "https://search.51job.com/list/030200,000000,0000,00,9,99,"+job+",2,1.html"
# 设置请求头,模拟成是浏览器访问
header = {
"User-Agent": '''Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'''
}
req = urllib.request.Request(url,headers=header)
response = urllib.request.urlopen(req).read().decode("gbk")
jobNum = re.findall(jobNumRe,response)
return jobNum
if __name__ == '__main__':
jobList = ["python","java","项目经理"]
for job in jobList:
print(getJobNum(job))
7、模拟有道翻译
import urllib
from urllib import request,parse
def getTranslate(kw):
'''
模拟有道翻译,
:param kw: 关键字
:return: 翻译结果
'''
# 设置请求头
header = {
"User-Agent": '''Mozilla/5.0 (Windows NT 10.0; Win64; x64)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'''
}
# 设置表单数据
data = {
"i": kw,
"from": "AUTO",
"to": "AUTO",
"smartresult": "dict",
"client": "fanyideskweb",
"salt": "1530692157778",
"sign": "86981073c4755432afabd9680e3127ab",
"doctype": "json",
"version": "2.1",
"keyfrom": "fanyi.web",
"action": "FY_BY_REALTIME",
"typoResult": "false",
}
data = urllib.parse.urlencode(data).encode("utf-8")
# url = "http://fanyi.youdao.com/translate_o?smartresult=dict&smartresult=rule"
# {"errorCode":50},使用上面这个url会报错
url = "http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule"
#构建请求体
req = urllib.request.Request(url,data=data,headers=header)
response = urllib.request.urlopen(req)
# 字符串转成字典
retList = eval(response.read().decode("utf-8"))
# print(ret)
# print(retList["translateResult"])
retL = []
for ret in retList["translateResult"]:
# print(ret[0]["tgt"])
retL.append(ret[0]["tgt"])
return retL
if __name__ == '__main__':
kw = input("输入要翻译的词语:")
response = getTranslate(kw)
print(response)
后记
【后记】为了让大家能够轻松学编程,我创建了一个公众号【轻松学编程】,里面有让你快速学会编程的文章,当然也有一些干货提高你的编程水平,也有一些编程项目适合做一些课程设计等课题。
也可加我微信【1257309054】,拉你进群,大家一起交流学习。
如果文章对您有帮助,请我喝杯咖啡吧!
公众号
关注我,我们一起成长~~
Python爬虫urllib模块的更多相关文章
- python爬虫 urllib模块url编码处理
案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦'的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...
- python 爬虫 urllib模块 目录
python 爬虫 urllib模块介绍 python 爬虫 urllib模块 url编码处理 python 爬虫 urllib模块 反爬虫机制UA python 爬虫 urllib模块 发起post ...
- python爬虫-urllib模块
urllib 模块是一个高级的 web 交流库,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象.urllib 支持各种 web 协议,例如:HTTP.FTP.Gophe ...
- python 爬虫 urllib模块 发起post请求
urllib模块发起的POST请求 案例:爬取百度翻译的翻译结果 1.通过浏览器捉包工具,找到POST请求的url 针对ajax页面请求的所对应url获取,需要用到浏览器的捉包工具.查看百度翻译针对某 ...
- python 爬虫 urllib模块介绍
一.urllib库 概念:urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urll ...
- python 爬虫 urllib模块 反爬虫机制UA
方法: 使用urlencode函数 urllib.request.urlopen() import urllib.request import urllib.parse url = 'https:// ...
- python 爬虫 urllib模块 url编码处理
案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦’的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...
- 定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容。提示(可以了解python的urllib模块)
定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容.提示(可以了解python的urllib模块) import urllib.request def get_ ...
- Python爬虫Urllib库的高级用法
Python爬虫Urllib库的高级用法 设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Head ...
随机推荐
- Azure Cosmos DB (一) 入门介绍
一,引言 今天是国庆.中秋双节房价的第三天,今天抽时间分享一篇关于使用Azure 提供的一项NoSql 服务-----Azure Cosmos DB.就有人问了,我听说过 MongoDB.Redis ...
- three.js学习5_渲染器
THREE.WebGLRenderer WebGL Render 用WebGL渲染出你精心制作的场景 介绍 在之前的介绍中, 已经介绍过场景, 相机, 光源, 有了这些后, 就可以形成一个可观的三维展 ...
- mysql插入数据报 (Incorrect string value: '\xB6\xFE' for column 'name' at row 1)
这是我的表结构 mysql> describe students; +--------+---------------------+------+-----+---------+-------- ...
- 编程体系结构(07):JavaEE之Web开发
本文源码:GitHub·点这里 || GitEE·点这里 一.基础概念 1.CS与BS架构 CS架构模式 客户端/服务器(Client/Server)模式,既要编写服务器端程序,也要开发客户端程序,软 ...
- 一文搞懂PV、UV、VV、IP及其关系与计算
写在前面 十一长假基本上过去了,很多小伙伴在假期当中还是保持着持续学习的心态,也有不少小伙伴在微信上问我,让我推送相关的文章.这个时候,我都是抽空来整理小伙伴们的问题,然后,按照顺序进行推文. PS: ...
- JAVA学习线路:day01面向对象(继承、抽象类)
所有的文档和源代码都开源在GitHub: https://github.com/kun213/DailyCode上了.希望我们可以一起加油,一起学习,一起交流. day01面向对象[继承.抽象类] 今 ...
- Java bean 链式获取成员变量无需判空的工具设计
Java bean 链式获取成员变量无需判空的工具设计 本篇文章已发布至公众号 Hollis 对于Java程序员来说,null是令人头痛的东西.时常会受到空指针异常(NPE)的骚扰.连Java的发明者 ...
- 添加Google网络地图功能
在MeteoInfo中添加了Google网络地图功能.打开MeteoInfo软件,选中图层管理区的一个Map Frame(New Map Frame),点击鼠标右键,在弹出菜单中点击Add Web L ...
- CentOS 7操作系统目录结构介绍
CentOS 7操作系统目录结构介绍 操作系统存在着大量的数据文件信息,相应文件信息会存在于系统相应目录中,为了更好的管理数据信息,会将系统进行一些目录规划,不同目录存放不同的资源. 根下目录结构说明 ...
- 【暑假集训】HZOI2019 水站 多种解法
题目内容 已知有一个\(n\)层的水站: \(W_i\)表示未操作之前第\(i\)层的已有水量: \(L_i\)表示第\(i\)个水站能够维持或者储存的水的重量: 表示在第\(P_i\)层进行减压放水 ...