Python使用urllib,urllib3,requests库+beautifulsoup爬取网页
Python使用urllib/urllib3/requests库+beautifulsoup爬取网页
笔者使用的是python 3.8.1
urllib
urllib提供了一系列用于操作URL的功能。
urllib的request模块可以非常方便地抓取URL内容,也就是发送一个GET请求到指定的页面,然后返回HTTP的响应。
使用pip下载:
pip install urllib
例如对百度搜索界面的抓取(www.baidu.com)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib
from urllib import request
if __name__ == "__main__":
headers = {
'Connection': 'Keep-Alive',
'Accept': 'text/html, application/xhtml+xml, */*',
'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'Mozilla/6.1 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
'Host': 'www.so.com',
'Referer': 'https://www.so.com'
}
respond = urllib.request.urlopen('http://www.baidu.com', headers=headers)
print(respond.read().decode('utf-8'))
参考网站:
廖雪峰的官方网站
urllib3
urllib3是一个功能强大且友好的Python HTTP客户端。大多数Python生态系统已经使用urllib3,您也应该使用。urllib3带来了Python标准库中缺少的许多关键功能:
线程安全。
连接池。
客户端SSL / TLS验证。
使用分段编码上传文件。
重试请求和处理HTTP重定向的助手。
支持gzip,deflate和brotli编码。
HTTP和SOCKS的代理支持。
100%的测试覆盖率。
urllib3功能强大且易于使用:
下载:
pip install urllib3
例如抓取百度搜索界面(www.baidu.com)
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import urllib3
if __name__ == "__main__":
http = urllib3.PoolManager()
headers = {
'Connection': 'Keep-Alive',
'Accept': 'text/html, application/xhtml+xml, */*',
'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'Mozilla/6.1 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko'
}
r=http.request('GET', 'http://www.baidu.com', headers=headers)
print(r.data)
requests
我们已经讲解了Python内置的urllib模块和其升级版urllib3,用于访问网络资源。但是,它用起来比较麻烦,而且,缺少很多实用的高级功能。
更好的方案是使用requests。它是一个Python第三方库,处理URL资源特别方便。
下载:
pip install requests
注意有 s 在requests中
例如抓取360搜索结果:
# -*- coding: utf-8 -*-
import requests
if __name__ == '__main__':
keyword = "123sad"
keyword = input("请输入你想搜索的内容")
try:
#添加headers防止被最简单的反爬虫阻止,在chrome按F12后点击Network中一个下滑查看
headers = {
'Connection': 'Keep-Alive',
'Accept': 'text/html, application/xhtml+xml, */*',
'Accept-Language': 'en-US,en;q=0.8,zh-Hans-CN;q=0.5,zh-Hans;q=0.3',
'Accept-Encoding': 'gzip, deflate',
'User-Agent': 'Mozilla/6.1 (Windows NT 6.3; WOW64; Trident/7.0; rv:11.0) like Gecko',
'Host': 'www.so.com',
'Referer': 'https://www.so.com'
}
page = 1
#GET参数列表
kv = {'q': keyword, 'ie': 'utf-8', 'pn': page}
# requests.ReadTimeout(60)
r = requests.get("http://www.so.com/s", headers=headers,
params=kv)
print('url:'+r.request.url)
r.raise_for_status()
html = r.text
print(html)
except requests.HTTPError as a:
print(a)
print("爬取失败")
except:
print('失败')
参考网站:廖雪峰的官方网站
笔者在爬取时遇到的问题
1.结果不全
笔者在vs code 中执行时,结果显示不全
如果结果显示不全,需要在cmd中执行文件
python xxx.py
2.‘抓取失败’
显示该问题,一般是因为IP被屏蔽
目前很多搜索引擎都装备了反爬虫,这个时候需要重启路由器(重新拨号)或者挂代理(proxy),或者试一试别的搜索引擎,笔者抓取百度时频繁出现错误,只能抓取360搜索
3.返回乱码
对返回结果解码
html.decode('utf-8')
进阶
urllib
parse
使用parse模块拼接参数:
params = {'ie': 'utf-8', 'wd': 'python是这个世界上最好的语言'}
url = 'www.baidu.com/s?'+urllib.parse.urlencode(params)
print(url)
结果:
www.baidu.com/s?ie=utf-8&wd=python%E6%98%AF%E8%BF%99%E4%B8%AA%E4%B8%96%E7%95%8C%E4%B8%8A%E6%9C%80%E5%A5%BD%E7%9A%84%E8%AF%AD%E8%A8%80
error
在urllib中设置了两个主要异常类,一个是URLError,一个是HTTPError
try:
...
except urllib.error.HTTPError as e:
print(e.code)#错误码
print(e.reason)#错误的原因
pring(e.headers)#响应的报头
except urllib.error.URLError as e:
print(e)
re库
re库是用来分析网页返回结果的正则库
安装:
pip install re
正则:
import re
pattern = re.compile(
r'<li class="res-list" data-lazyload="1"><h3 class="res-title "><a href="(.*?)"', re.S)
results = pattern.findall(html)
其中,re.compile是创建正则式,findall是在文本中匹配全部,并返回数组格式的数据
有关正则表达式写法和更多数据请看官方文档
笔者推荐使用requests库
beautifulsoup
Beautiful Soup 是一个可以从HTML或XML文件中提取数据的Python库.它能够通过你喜欢的转换器实现惯用的文档导航,查找,修改文档的方式.Beautiful Soup会帮你节省数小时甚至数天的工作时间.
pip安装:
pip install bs4
如果要使用lxml解析器请参考博客园,因为下载太慢,笔者使用html解析器
使用beautifulsoup提取指定的html元素:
soup = BeautifulSoup(req.text, "html")
#req是resquests返回的结果
soup.find(name="div", attrs={"class" :"a","id":"b"})
#提取<div class="a" id="b">的元素内容
soup.select(".a")
#提取class="a"的元素,可以使用# .等选择器
human_list=beautifulsoup("<p class='a'></p>")
print(human_list.p["class"])#输出 a
如果要取html元素里的内容,用xx.string或者.text
参考链接
点我跳转官方文档
例子:
以下代码爬取了https://www.baidu.com/s?ie=UTF-8&wd=afs的第一条搜索结果的名字
import requests
from bs4 import BeautifulSoup
url = "https://www.baidu.com/s?ie=UTF-8&wd=afs"
headers = {'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.87 Safari/537.36'}
req = requests.get(url, headers=headers)
#soup = BeautifulSoup(req.text, "lxml")#使用lxml解析器
soup = BeautifulSoup(req.text, "html")#使用html解析器
human_list=soup.find(name="div", attrs={"class" :"c-abstract"})
human_list=str(human_list)
human_list=human_list.replace('<div class="c-abstract c-abstract-en">',"")
human_list=human_list.replace("</div>","")
human_list=human_list.replace("\n","")
print(human_list)
输出:
<em>AFS</em> study abroad, education and volunteer programs empower people of all ages and backgrounds with essential intercultural knowledge, skills and understanding.
END
Python使用urllib,urllib3,requests库+beautifulsoup爬取网页的更多相关文章
- Python Requests库网络爬取全代码
#爬取京东商品全代码 import requestsurl = "http://item.jd.com/2967929.html"try: r = requests.get(url ...
- python Requests库网络爬取IP地址归属地的自动查询
#IP地址查询全代码import requestsurl = "http://m.ip138.com/ip.asp?ip="try: r = requests.get(url + ...
- 利用requests和BeautifulSoup爬取菜鸟教程的代码与图片并保存为markdown格式
还是设计模式的开卷考试,我想要多准备一点资料,于是写了个爬虫爬取代码与图片,有巧妙地进行格式化进一步处理,最终变为了markdown的格式 import requests from bs4 impor ...
- python网络爬虫之scrapy 调试以及爬取网页
Shell调试: 进入项目所在目录,scrapy shell “网址” 如下例中的: scrapy shell http://www.w3school.com.cn/xml/xml_syntax.as ...
- [原创]python爬虫之BeautifulSoup,爬取网页上所有图片标题并存储到本地文件
from bs4 import BeautifulSoup import requests import re import os r = requests.get("https://re. ...
- python爬虫之一:requests库
目录 安装requtests requests库的连接异常 HTTP协议 HTTP协议对资源的操作 requests库的7个主要方法 request方法 get方法 网络爬虫引发的问题 robots协 ...
- [Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息
[Python爬虫] 使用 Beautiful Soup 4 快速爬取所需的网页信息 2018-07-21 23:53:02 larger5 阅读数 4123更多 分类专栏: 网络爬虫 版权声明: ...
- requests爬取网页的通用框架
概述 代码编写完成时间:2017.12.28 写文章时间:2017.12.29 看完中国大学MOOC上的爬虫教程后,觉得自己之前的学习完全是野蛮生长,决定把之前学的东西再梳理一遍,主要是觉得自己写的程 ...
- python requests库爬取网页小实例:爬取网页图片
爬取网页图片: #网络图片爬取 import requests import os root="C://Users//Lenovo//Desktop//" #以原文件名作为保存的文 ...
随机推荐
- numpy 中的堆叠 stack
参考: https://blog.csdn.net/Riverhope/article/details/78922006 vstack,vertical 垂直堆叠 hstack, horizontal ...
- jquery和zepto有何区别?
1.针对移动端程序,Zepto有一些基本的触摸事件可以用来做触摸屏交互(tap事件.swipe事件),Zepto是不支持IE浏览器的. 2.DOM操作的区别:添加id时jQuery不会生效而Zepto ...
- 深入理解Java虚拟机(三)——垃圾回收策略
所谓垃圾收集器的作用就是回收内存空间中不需要了的内容,需要解决的问题是回收哪些数据,什么时候回收,怎么回收. Java虚拟机的内存分为五个部分:程序计数器.虚拟机栈.本地方法栈.堆和方法区. 其中程序 ...
- MySQL函数与存储过程
一.函数,参考博客:https://www.cnblogs.com/progor/p/8871480.html /* 函数:函数只会返回一个值,不允许返回一个结果集.函数强调返回值,所以不允许返回多个 ...
- 为了Java微信支付V3开发包,我找出了微信支付文档至少六个错误
1. 前言 最近忙的一批,难得今天有喘气的机会就赶紧把最近在开发中的一些成果分享出来.前几日分享了自己写的一个微信支付V3的开发包payment-spring-boot-starter,就忙里偷闲完善 ...
- JavaSE03-运算符&分支语句
1.运算符 1.1 算术运算符 1.1.1 运算符和表达式 运算符:对常量或者变量进行操作的符号 表达式:用运算符把常量或者变量连接起来符合java语法的式子就可以称为表达式. 不同运算符连接的表达式 ...
- C++ string常见函数总结
基础概念 对照功能列表:不能直接回答的再去看相应解析说明. begin 得到指向字符串开头的 Iterator end 得到指向字符串结尾的 Iterator rbegin 得到指向反向字符串开头的 ...
- [日常摸鱼][poj2777]Count Color-线段树
辣鸡会考考完啦哈哈哈哈 题意:一块板分成$L$块,每次给一段连续的块染色或者询问一段有几种颜色,颜色的范围$\leq 30$ 我记得我好像做过一个类似的二维染色的问题-不过那个用树状数组直接过掉了- ...
- 悉数 Python 函数传参的语法糖
TIOBE排行榜是程序开发语言的流行使用程度的有效指标,对世界范围内开发语言的走势具有重要参考意义.随着数据挖掘.机器学习和人工智能相关概念的风行,Python一举收获2018年年度语言,这也是Pyt ...
- Python基础入门:注释、变量、运算符与数据类型
一.为什么要学习python? python的特点 python作为一门脚本语言,在越来越多的行业和领域发挥着重大作用,比如机器学习.网站开发.数据分析.爬虫.自动化测试. 同时,python具备以下 ...