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模块的更多相关文章

  1. python爬虫 urllib模块url编码处理

    案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦'的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...

  2. python 爬虫 urllib模块 目录

    python 爬虫 urllib模块介绍 python 爬虫 urllib模块 url编码处理 python 爬虫 urllib模块 反爬虫机制UA python 爬虫 urllib模块 发起post ...

  3. python爬虫-urllib模块

    urllib 模块是一个高级的 web 交流库,其核心功能就是模仿web浏览器等客户端,去请求相应的资源,并返回一个类文件对象.urllib 支持各种 web 协议,例如:HTTP.FTP.Gophe ...

  4. python 爬虫 urllib模块 发起post请求

    urllib模块发起的POST请求 案例:爬取百度翻译的翻译结果 1.通过浏览器捉包工具,找到POST请求的url 针对ajax页面请求的所对应url获取,需要用到浏览器的捉包工具.查看百度翻译针对某 ...

  5. python 爬虫 urllib模块介绍

    一.urllib库 概念:urllib是Python自带的一个用于爬虫的库,其主要作用就是可以通过代码模拟浏览器发送请求.其常被用到的子模块在Python3中的为urllib.request和urll ...

  6. python 爬虫 urllib模块 反爬虫机制UA

    方法: 使用urlencode函数 urllib.request.urlopen() import urllib.request import urllib.parse url = 'https:// ...

  7. python 爬虫 urllib模块 url编码处理

    案例:爬取使用搜狗根据指定词条搜索到的页面数据(例如爬取词条为‘周杰伦’的页面数据) import urllib.request # 1.指定url url = 'https://www.sogou. ...

  8. 定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容。提示(可以了解python的urllib模块)

    定义一个方法get_page(url),url参数是需要获取网页内容的网址,返回网页的内容.提示(可以了解python的urllib模块) import urllib.request def get_ ...

  9. Python爬虫Urllib库的高级用法

    Python爬虫Urllib库的高级用法 设置Headers 有些网站不会同意程序直接用上面的方式进行访问,如果识别有问题,那么站点根本不会响应,所以为了完全模拟浏览器的工作,我们需要设置一些Head ...

随机推荐

  1. Spring循环依赖的问题

      什么是循环依赖?就是两个Bean相互引用,比如用@Autowire 相互注入.   那么Spring是如何解决这个问题的呢?在Bean还未完全实例化前(类只实例化了一部分),将bean提前暴露出来 ...

  2. 联赛模拟测试10 C. 射手座之日

    题目描述 分析 方法一(线段树) 线段树维护的是以当前节点为左端点的区间的贡献 而区间的右端点则会从 \(1\) 到 \(n\) 逐渐右移 当我们把右端点从 \(i-1\) 的位置扩展到 \(i\) ...

  3. JavaFX ImageView

    例子1:显示4个狗头.正常显示左上角.右下角的狗头:右上角的狗头旋转180°,并设置了透明度:左下角的狗头旋转90°,也设置了透明度. 1 import javafx.application.Appl ...

  4. P5091 【模板】扩展欧拉定理

    题目链接 昨天考试考到了欧拉公式,结果发现自己不会,就来恶补一下. 欧拉公式 \(a^b \bmod p = a^{b}\) \(b < \varphi(p)\) \(a^b \bmod p = ...

  5. 对do{ }while();一直以来的误解 -----如何理解do{ }while( );语句

    在do{ }while( ); 语句中,我之前的理解是:先执行一次do{ },然后判断while( )中的内容,一般里面都是字符串或者数值作比较嘛,所以理解是:如果判断的这个东西,在这个范围中(等于这 ...

  6. Oracle 正确删除归档日志的方法

    我们都知道在controlfile中记录着每一个archivelog文件的相关信息,当然们在OS下把这些物理文件delete掉后,在我们的controlfile中仍然记录着这些archivelog文件 ...

  7. (转载)Quartus II中FPGA的管脚分配保存方法(Quartus II)

    一.摘要 将Quartus II中FPGA管脚的分配及保存方法做一个汇总. 二.管脚分配方法 FPGA 的管脚分配,除了在QII软件中,选择"Assignments ->Pin&quo ...

  8. 学习go语言并完成第一个作品

    之前有使用C#写一个Windows下的发送邮件的命令行工具,方便一些脚本出现异常时向我的邮箱发送邮件提醒.但这并没有被我频繁使用,因为我的有些脚本还是在linux下面运行,因此我又有一篇文章用linu ...

  9. 【树形DP】NOI2003 逃学的小孩

    题目大意 题目链接 PS:可能出题人为了提高难度故意加了很多废话--实际上题目是很简单的 在一棵树上找3个点A.B.C,使AB+BC最大,且满足AC>AB. 样例输入 4 31 2 12 3 1 ...

  10. Martyr2项目实现——Number部分的问题求解 (1) Find Pi to Nth Digit

    Martyr2项目实现--Number部分的问题求解 (1) Find Pi to Nth Digit Find Pi to Nth Digit 问题描述: Find PI to the Nth Di ...