使用 Python 爬取网页数据

使用 Python 爬取网页数据在需要过去一些网页上的信息的时候 使用 Python 写爬虫来爬取十分方便 1 使用 urllib request 获取网页 urllib 是 Python 內建的 HTTP 库 使用 urllib 可以只需要很简单的步骤就能高效采集数据 配合 Beautiful 等 HTML 解析库 可以编写出用于采集网络数据的大型爬虫 注 示例代码使用 Python3 编写 urllib 是 Python2 中 urllib 和 urllib2 两个库合并而来 Python2 中的 urllib2 对应

在需要过去一些网页上的信息的时候,使用 Python 写爬虫来爬取十分方便。

1. 使用 urllib.request 获取网页

urllib 是 Python 內建的 HTTP 库, 使用 urllib 可以只需要很简单的步骤就能高效采集数据; 配合 Beautiful 等 HTML 解析库, 可以编写出用于采集网络数据的大型爬虫;

注: 示例代码使用Python3编写; urllib 是 Python2 中 urllib 和 urllib2 两个库合并而来, Python2 中的 urllib2 对应 Python3中的 urllib.request
简单的示例:

import urllib.request # 引入urllib.request response = urllib.request.urlopen('http://www.zhihu.com') # 打开URL
html = response.read() # 读取内容
html = html.decode('utf-8') # 解码 print(html) 

2. 伪造请求头信息

有时爬虫发起的请求会被服务器拒绝, 这时就需要将爬虫伪装成人类用户的浏览器, 这通常通过伪造请求头信息实现, 如:

import urllib.request #定义保存函数 def saveFile(data): path = "E:\\projects\\Spider\\02_douban.out" f = open(path,'wb') f.write(data) f.close() #网址 url = "https://www.douban.com/" headers = { 
   'User-Agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) ' 'Chrome/51.0.2704.63 Safari/537.36'} req = urllib.request.Request(url=url,headers=headers) res = urllib.request.urlopen(req) data = res.read() #也可以把爬取的内容保存到文件中 saveFile(data) data = data.decode('utf-8') #打印抓取的内容 print(data) #打印爬取网页的各类信息 print(type(res)) print(res.geturl()) print(res.info()) print(res.getcode()) 

3. 伪造请求主体

在爬取某一些网站时, 需要向服务器 POST 数据, 这时就需要伪造请求主体;

为了实现有道词典在线翻译脚本, 在 Chrome 中打开开发工具, 在 Network 下找到方法为 POST 的请求, 观察数据可以发现请求主体中的 ‘ i ‘ 为经过 URL 编码的需要翻译的内容, 因此可以伪造请求主体, 如:

import urllib.request import urllib.parse import json while True: content = input('请输入要翻译的内容:') if content == 'exit!': break url='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null' # 请求主体 data = { 
   } data['type'] = "AUTO" data['i'] = content data['doctype'] = "json" data['xmlVersion'] = "1.8" data['keyfrom'] = "fanyi.web" data['ue'] = "UTF-8" data['action'] = "FY_BY_CLICKBUTTON" data['typoResult'] = "true" data = urllib.parse.urlencode(data).encode('utf-8') head = { 
   } head['User-Agent'] = 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/ Firefox/45.0' req = urllib.request.Request(url,data,head) # 伪造请求头和请求主体 response = urllib.request.urlopen(req)
    html = response.read().decode('utf-8') target = json.loads(html) print('翻译结果: ',(target['translateResult'][0][0]['tgt'])) 

也可以使用 add_header() 方法伪造请求头, 如:

import urllib.request import urllib.parse import json while True: content = input('请输入要翻译的内容(exit!):') if content == 'exit!': break url = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null' # 请求主体 data = { 
   } data['type'] = "AUTO" data['i'] = content data['doctype'] = "json" data['xmlVersion'] = "1.8" data['keyfrom'] = "fanyi.web" data['ue'] = "UTF-8" data['action'] = "FY_BY_CLICKBUTTON" data['typoResult'] = "true" data = urllib.parse.urlencode(data).encode('utf-8') req = urllib.request.Request(url,data) req.add_header('User-Agent','Mozilla/5.0 (Macintosh; Intel Mac OS X 10.11; rv:45.0) Gecko/ Firefox/45.0') response = urllib.request.urlopen(req) html=response.read().decode('utf-8') target = json.loads(html) print('翻译结果: ',(target['translateResult'][0][0]['tgt'])) 

4. 使用代理IP

为了避免爬虫采集过于频繁导致的IP被封的问题, 可以使用代理IP, 如:

# 参数是一个字典{'类型':'代理ip:端口号'} proxy_support = urllib.request.ProxyHandler({ 
   'type': 'ip:port'}) # 定制一个opener opener = urllib.request.build_opener(proxy_support) # 安装opener urllib.request.install_opener(opener) #调用opener opener.open(url) 

注: 使用爬虫过于频繁的访问目标站点会占用服务器大量资源, 大规模分布式爬虫集中爬取某一站点甚至相当于对该站点发起DDOS攻击; 因此, 使用爬虫爬取数据时应该合理安排爬取频率和时间; 如: 在服务器相对空闲的时间 ( 如: 凌晨 ) 进行爬取, 完成一次爬取任务后暂停一段时间等;

5. 检测网页的编码方式

尽管大多数网页都是用 UTF-8 编码, 但有时候会遇到使用其他编码方式的网页, 因此必须知道网页的编码方式才能正确的对爬取的页面进行解码;

chardet 是 python 的一个第三方模块, 使用 chardet 可以自动检测网页的编码方式;

安装 chardet : pip install charest
使用:

import chardet url = 'http://www,baidu.com'
html = urllib.request.urlopen(url).read() >>> chardet.detect(html) { 
   'confidence': 0.99, 'encoding': 'utf-8'} 

6. 获得跳转链接

有时网页一个页面需要在原始 URL 的基础上进行一次甚至多次跳转才能最终到达目的页面, 因此需要正确的处理跳转;

通过 requests 模块的 head() 函数获得跳转链接的 URL , 如

url='https://unsplash.com/photos/B1amIgaNkwA/download/' res = requests.head(url) re=res.headers['Location'] 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233149.html原文链接:https://javaforall.net

(0)
上一篇 2025年8月11日 下午7:01
下一篇 2025年8月11日 下午7:22


相关推荐

  • 如何实现复选框的全选和取消全选效果

    如何实现复选框的全选和取消全选效果:在很多网站都有这样的功能,当点击一个全选按钮之后,所有的复选框都会被选中,再点击之后会取消全选,功能非常的人性化,可以省却很多人力,下面就简单介绍一下JS如何实现此

    2021年12月21日
    49
  • 浅谈手机杀毒软件及手机病毒管理_防手机病毒杀毒软件

    浅谈手机杀毒软件及手机病毒管理_防手机病毒杀毒软件十一国庆长假刚过,又传出爆发手机病毒.到底有没有手机病毒??是手机杀毒软件公司的忽悠,还是真有手机病毒?很多资深IT人士都曾暴料,手机病毒是吹出来的根本不存在,因为智能手机操作系统都不相同,智能手机塞班、苹果OS、WM等平台的内部程序都是不对外公开的.纵使国内的山寨iphone外壳模仿得再像,但其内部的操作界面是无论如何做不出类似OS那样华丽的效果的;再有,各大手机系统都互不兼容,想要做到病毒

    2026年3月3日
    4
  • idea 2022.01激活(JetBrains全家桶)2022.01.28

    (idea 2022.01激活)最近有小伙伴私信我,问我这边有没有免费的intellijIdea的激活码,然后我将全栈君台教程分享给他了。激活成功之后他一直表示感谢,哈哈~https://javaforall.net/100143.htmlIntelliJ2021最新激活注册码,破解教程可免费永久激活,亲测有效,上面是详细链接哦~GTRP…

    2022年3月31日
    56
  • AD15中PCB设置NET CLASS规则

    AD15中PCB设置NET CLASS规则1,执行菜单命令设计-类或者快捷命令DC计入如下界面2,右键新建一个类类)X*O-K,M9}0C6v3,吧电源和GND网络都加载到右边,PWR类创建完毕 4,这时候在规则里面就可对这个类进行调用和约束…

    2022年7月16日
    17
  • 使用 create-react-app 构建 react应用程序「建议收藏」

    使用 create-react-app 构建 react应用程序

    2022年3月3日
    40
  • mysql如何修改root用户的密码「建议收藏」

    mysql如何修改root用户的密码「建议收藏」方法1:用SETPASSWORD命令首先登录MySQL。格式:mysql>setpasswordfor用户名@localhost=password(‘新密码’);例子:mysql>setpasswordforroot@localhost=password(‘123’);方法2:用mysqladmin格式:mysqladmin-u用户名-…

    2022年5月20日
    39

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号