爬虫基础 之 urllib
一、urllib
1. 访问
urllib.request.urlopen()
参数:
- url:需要爬取的URL地址
- timeout:设置等待时间,指定时间内未得到相应时抛出异常
# 导入模块
import urllib.request
url = "http://www.baidu.com/"
# 向百度发起请求,得到相应对象
html = urllib.request.urlopen(url)
print(html.read().decode("utf-8")) # 得到网页源代码,为str类型
print(html.status) # 得到响应状态码
2.响应方法
1、bytes = response.read() # 获取原生的网页源码
2、string = response.read().decode("utf-8") # 获取网页源码并转码
3、url = response.geturl() # 获取资源的URL
4、code = response.getcode() # 获取响应状态码
5、string.encode() # string --> bytes
6、bytes.decode() # bytes --> string
3. 包装
3.1 User-Agent
urllib.request.Request()
作用:创建请求对象(包装请求,重构User-Agent,使程序更像正常人类请求)
参数:
- url:请求的url地址
- headers:添加请求头
使用
- 构造请求对象(重构User-Agent)
- 发送请求获取响应对象(urlopen)
- 获取响应内容
from urllib import request
url = "http://www.httpbin.org/get"
header = {"User-Agent" : "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.100 Safari/537.36"}
# 向百度发起请求,得到相应对象
res = request.Request(url, headers=header)
res = request.urlopen(res)
html = res.read().decode("utf-8")
print(html)
另外,python还提供了第三库
fake_useragent来随机生成User-Agentfrom fake_useragent import UserAgent
useragent = UserAgent()
useragent = {"User-Agent" : useragent.random}
print(useragent)
print(useragent)
print(useragent)
print(useragent)
3.2 编码
urllib.parse.urlencode()
编码之前:https://www.baidu.com/s?&wd=美女
编码之后:https://www.baidu.com/s?&wd=%E7%BE%8E%E5%A5%B3
In [1]: from urllib import parse
In [2]: query_string = {"wd" : "美女"}
In [3]: reslut = parse.urlencode(query_string)
In [4]: print(reslut)
wd=%E7%BE%8E%E5%A5%B3
**访问百度**
from urllib import parse, request
from fake_useragent import UserAgent
header = {"User-Agent":UserAgent().random}
query_string = {"wd" : "美女"}
url = "https://www.baidu.com/s?" + parse.urlencode(query_string)
response = request.Request(url, headers=header)
html = request.urlopen(response).read().decode("utf-8")
print(html)
字符编码
In [10]: import urllib.parse
In [11]: string = urllib.parse.quote("美女")
In [13]: "https://www.baidu.com/s?wd=" + string
Out[13]: 'https://www.baidu.com/s?wd=%E7%BE%8E%E5%A5%B3'
字符解码
In [14]: import urllib.parse
In [15]: str = "%E7%BE%8E%E5%A5%B3"
In [16]: urllib.parse.unquote(str)
Out[16]: '美女'
3.3 多参数
In [1]: from urllib import parse
In [2]: query_string_dic = {
...: "wd" : "美女",
...: "pn" : "50"
...: }
In [3]: r = parse.urlencode(query_string_dic)
In [4]: r
Out[5]: 'wd=%E7%BE%8E%E5%A5%B3&pn=50'
不难发现,parse会在两个参数之间自动加上&符号,因此可以直接构造URL访问
3.4 拼接URL
字符串相加
'https://www.baidu.com/s?' + urlencode({"wd" : "美女", "pn" : "50"})字符串格式化(占位符)
'https://www.baidu.com/s?%s' % urlencode({"wd" : "美女", "pn" : "50"})format()
'https://www.baidu.com/s?{}'.format(urlencode({"wd" : "美女", "pn" : "50"}))
请求百度搜索的内容,把响应内容保存到本地文件
from urllib import request, parse
from fake_useragent import UserAgent
wd = input("请输入关键字:")
url = "https://www.baidu.com/?{}".format(parse.urlencode({"wd":wd}))
header = {"User-Agent" : UserAgent().random}
req = request.Request(url=url, headers=header)
res = request.urlopen(req)
html = res.read().decode("utf-8")
filename = "{}.html".format(wd)
with open(filename, "w") as f:
f.write(html)
在读写文件的时候经常遇见编码问题
在Windows中使用utf-8会报错
UnicodeEncodeError: 'gbk' codec can't encode character '\xbb' in position 30904: illegal multibyte sequence
在读写文件加上参数
with open("demo.txt", encoding="gbk18030") as f这种编码识别的国标会更多
4. 示例
百度贴吧数据抓取
要求
- 输入贴吧名称
- 输入起始页
- 输入终止页
- 保存到本地文件:第1页.html、第2页.html ...
代码实现
from urllib import parse, request
from fake_useragent import UserAgent
import time
import random
class BaiduSpider(object):
def __init__(self):
self.url = "http://tieba.baidu.com/f?kw{}&pn={}"
self.headers = {"User-Agent" : UserAgent().random}
# 获取响应页面
def get_page(self, url):
req = request.Request(url=url, headers=self.headers)
res = request.urlopen(req)
html = res.read().decode("utf-8")
return html
# 提取数据
def parse_page(self):
pass
# 保存数据
def write_page(self, filename, html):
with open(filename, "w", encoding="utf-8") as f:
f.write(html)
# 主函数
def main(self):
name = input("请输入贴吧名:")
start = int(input("请输入起始页:"))
end = int(input("请输入终止页:"))
# 拼接URL,发送请求
for page in range(start, end+1):
pn = (page - 1) * 50
kw = parse.quote(name)
url = self.url.format(kw, pn)
# 获取响应,保存
html = self.get_page(url)
filename = "{}-第{}页.html".format(name, page)
self.write_page(filename, html)
# 控制速度,随机休眠
time.sleep(random.randint(1, 3)) # 随机休眠1-3秒钟
if __name__ == '__main__':
spider = BaiduSpider()
spider.main()
爬虫基础 之 urllib的更多相关文章
- 【学习笔记】第二章 python安全编程基础---python爬虫基础(urllib)
一.爬虫基础 1.爬虫概念 网络爬虫(又称为网页蜘蛛),是一种按照一定的规则,自动地抓取万维网信息的程序或脚本.用爬虫最大的好出是批量且自动化得获取和处理信息.对于宏观或微观的情况都可以多一个侧面去了 ...
- 爬虫基础(1):urllib库
urllib库 urllib库是python中的一个基本网络请求库.用于模拟浏览器的行为,向指定服务器发送请求,并接收返回的数据. 在python3中所有的网络请求相关函数都集中在urllib.req ...
- Python爬虫基础之Urllib
一.随时随地爬取一个网页下来 怎么爬取网页?对网站开发了解的都知道,浏览器访问Url向服务器发送请求,服务器响应浏览器请求并返回一堆HTML信息,其中包括html标签,css样式,js脚本等.Chro ...
- 爬虫基础之urllib库(代码演示)
# 自定义opener from urllib.request import ProxyHandler,build_opener from urllib.error import URLError ...
- 爬虫基础之urllib库
urllib库的基本使用 urlopen() # 导入urllib库 import urllib # 往指定url发送请求,返回一个响应对象 response = urllib.request.url ...
- python 3.x 爬虫基础---Urllib详解
python 3.x 爬虫基础 python 3.x 爬虫基础---http headers详解 python 3.x 爬虫基础---Urllib详解 前言 爬虫也了解了一段时间了希望在半个月的时间内 ...
- 第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础
第三百三十六节,web爬虫讲解2—urllib库中使用xpath表达式—BeautifulSoup基础 在urllib中,我们一样可以使用xpath表达式进行信息提取,此时,你需要首先安装lxml模块 ...
- 第三百二十七节,web爬虫讲解2—urllib库爬虫—基础使用—超时设置—自动模拟http请求
第三百二十七节,web爬虫讲解2—urllib库爬虫 利用python系统自带的urllib库写简单爬虫 urlopen()获取一个URL的html源码read()读出html源码内容decode(& ...
- Python爬虫基础
前言 Python非常适合用来开发网页爬虫,理由如下: 1.抓取网页本身的接口 相比与其他静态编程语言,如java,c#,c++,python抓取网页文档的接口更简洁:相比其他动态脚本语言,如perl ...
随机推荐
- 未能加载文件或程序集“Spire.Pdf, Version=4.8.8.2020, Culture=neutral, PublicKeyToken=663f351905198cb3”或它的某一个依赖项。未能授予最小权限请求
问题:运行程序执行到代码报错:未能加载文件或程序集“Spire.Pdf, Version=4.8.8.2020, Culture=neutral, PublicKeyToken=663f3519051 ...
- windows下使用ssh(利用paramiko库)
环境:python3.7.3 win7 or win10 1.首先下载paramiko库 命令:pip install paramiko 2.代码: import paramiko 创建一个 ssh ...
- AAC的RTP封装中的AU头分析
解码器收到一个RTP的AAC流,发现RTP流里的音频里带有4个字节AU头,然后才是AAC的ADTS头. 这种情况之前已经出现过多次,每次我们都告知对方,不要往AAC前面加AU头,解码器不支 ...
- DVWA之命令执行
一.命令执行漏洞 命令执行漏洞是指可以随意执行系统命令,属于高危漏洞之一,也属与代码执行范围内,好比说一句话木马<?php@eval($_POST['cmd']);?> 二.分类: 1.代 ...
- php提示Undefined index的解决方法
我们在做php开发时有时可能会提示Notice: Undefined index: *** on line 249,出现上面这些是 PHP 的提示而非报错,PHP 本身不需要事先声明变量即可直接使用, ...
- linux cpu信息查看
转自:https://www.cnblogs.com/emanlee/p/3587571.html # 总核数 = 物理CPU个数 X 每颗物理CPU的核数 # 总逻辑CPU数 = 物理CPU个数 X ...
- vue-cli3和ts建立vue项目
第一步,如果你之前没有装vuecli,可以直接执行下面命令 npm install --global @vue/cli 注:这里我install 的时候不成,于是我用的是 cnpm install - ...
- Win10解决修改host没有权限问题(其他文件同理) 一步都不能少哦:先添加再授权
Step1:右键文件选择属性,选择安全,点击编辑: Step2:在弹窗中点击添加,在弹窗中点击高级: Step3:在弹窗中点击立即查找,选中当前用户,点击确定: Step4:此时选中用户已经被加入进来 ...
- Ansible常用模块整理
问答题 请总结今天所学的ansible模块,以及各个模块的作用! ping ping模块用来检查目标主机是否在线 例子:ansible webserver -m ping yum yum模块用来在Ce ...
- 【转】C++11新特性——lambda表达式
C++11的一大亮点就是引入了Lambda表达式.利用Lambda表达式,可以方便的定义和创建匿名函数.对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多 ...