使用 Python 爬取网页数据

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

1. 使用 urllib.request 获取网页

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

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

import urllib.request                    # 引入urllib.requestresponse =  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())

结果:
在这里插入图片描述伪造请求头可以用谷歌的插件Chrome UA Spoofer
在这里插入图片描述
右键点击选项便有许多人类用户的浏览器可以伪造,直接复制就行
在这里插入图片描述

3. 伪造请求主体

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

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

import urllib.request
import urllib.parse
import jsonwhile True:content = input('请输入要翻译的内容:')if content == 'exit!':breakurl='http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null'# 请求主体data = {}data['type'] = "AUTO"data['i'] = contentdata['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/20100101 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 jsonwhile True:content = input('请输入要翻译的内容(exit!):')if content == 'exit!':breakurl = 'http://fanyi.youdao.com/translate?smartresult=dict&smartresult=rule&smartresult=ugc&sessionFrom=null'# 请求主体data = {}data['type'] = "AUTO"data['i'] = contentdata['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/20100101 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']

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/358681.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

多线程(初级篇)

相关概念进程是指一个内存中运行的应用程序,每个进程都有自己独立的一块内存空间,一个进程中可以启动多个线程。一个进程是一个独立的运行环境,它可以被看作一个程序或者一个应用。而线程是在进程中执行的一个任务。Java运行环境是一个包含了…

了解ADF生命周期中的ADF绑定

在本文中,我将重点介绍ADF绑定层,并探讨当最初从浏览器请求带有某些数据的ADF页面时,它如何工作。 Oracle ADF提供了自己的JSF生命周期扩展版。 实际上,ADF扩展了标准JSF生命周期实现类,并提供了ADF阶段侦听器&#x…

绕过 WAF:绕过一些 WAF 设备的 Burp 插件

我写了这个插件使用的技术博客文章在这里一会儿回来。如果存在特定标头,许多 WAF 设备可能会被诱骗相信请求来自自身,因此是可信的。绕过方法的基础知识可以在此处的 HP 博客文章中找到。 一段时间以来,我一直在 Burp 中实施匹配/替换规则&…

windows apache部署php,Windows下部署Apache+PHP+MySQL运行环境实战

首先是MySQL,(这边吐槽一下被Oracle收购的MySQL)一步一步往下,无需更多的配置然后安装Apache,也是一步一步往下安装PHP,(我偷懒我自豪, 在PHP下载页面找那个Installer的文件.......吐槽可能不是最新的版本 ~)下载页面安…

粉丝提问:有没有人会做彩虹表

彩虹表就是一个庞大的、针对各种可能的字母组合预先计算好的哈希值的集合,不一定是针对MD5算法的,各种算法的都有,有了它可以快速的破解各类密码。越是复杂的密码,需要的彩虹表就越大,现在主流的彩虹表都是100G以上。 …

fofa自动化爬虫脚本更新+详解

fofa自动化爬虫脚本更新详解 起因 最近要用到fofa爬虫,为什么要用爬虫不用api,问就是穷,想起来之前写过一个相关的脚本:Fofa-python-脚本,是很久以前写的了,之前写的时候有点问题,昨天重新修…

【APICloud系列|16】苹果开发者账号如何更改双重认证的手机号

按照一般的更改流程: 现在苹果账号安全系统升级,一般需要同意协议或者和本公司密切相关的人员才能操作。我这种借苹果手机操作的人除外。 那我用win7电脑如何操作呢? 登录苹果开发者账号, 进入如下管理账号地址:htt…

JS文件信息收集工具-LinkFinder

0x00 前言 我们在渗透测试的之前,信息收集是必要的步骤,而JS文件中往往会暴露出很多的信息,比如一些注释的中铭感信息,内网ip地址泄露等等,还会有一些绝对路径或者相对路径的url,而这些url中很有可能就存在…

extjs中Store和grid的刷新问题

问题1:Store.load() 和Store.setproxy()区别 问题2:修改后的Grid 更新: Store.reload() 问题3,store删除后刷新会出问题 Store移除一行:Store.removeAt(Number index) 从数据集中删除指定索引位置的记录     或者Store.reload…

【APICloud系列|28】苹果开发者账号应该如何续费?

本次更新时间:2020/7/13 登录苹果开发者账号,一般还有1个月到期官方会给你发邮件,不懂英文的可以使用谷歌翻译功能。 目前的后台提醒是这样的,我给你翻译一下 这个如果没有到期,使用Apple Developer这个应用程序进行充值缴费。 对应地址:https://developer.apple.com/i…

linux中第一个进程的形成,Linux进程管理

1.进程基本概述定义:进程是已经启动的可执行程序的运行中实例。/proc目录下以数字为名的目录,每一个目录代表一个进程,保留着进程的属性信息,每一个进程的PID是唯一的,就算进程退出了,其他进程也不会占用其…

XX(北京)科技股份公司为啥需要购置服务器?

其实老板只是要一个量化的标准,只是没人能讲明白,我简单陈述一下: 公司现在只有一台阿里的1核两G的1M带宽服务器40G,属于低配,买了3年的,打了三折花了2800元左右,为啥需要额外购置服务器呢? 目前服务器上有,一个后台管理系统,一个小程序,一个APP,一个网站,目前就…

[BZOJ 1588] [HNOI 2002] 营业额统计

1588: [HNOI2002]营业额统计 Time Limit: 5 SecMemory Limit: 162 MBDescription 营业额统计 Tiger最近被公司升任为营业部经理,他上任后接受公司交给的第一项任务便是统计并分析公司成立以来的营业情况。 Tiger拿出了公司的账本,账本上记录了公司成立以…

Python----socket编程

socket 一、socket是什么? socket 通常也称为“套接字”,用于描述 IP 地址和端口,是一个通讯链的句柄。应用程序通常通过 “套接字”向网络发出请求或者应答网络请求。说白了,就是一种通讯机制。它类似于公司的电话客服部门&…

怎样编写测试类测试分支_测试技巧–不编写测试

怎样编写测试类测试分支对此没有太多疑问,测试代码的方式是一个有争议的问题。 不同的测试技术由于各种原因(包括企业文化,经验和总体心理观点)而受到不同开发人员的青睐。 例如,您可能更喜欢编写经典的单元测试&#…

怎么样才算高级java工程师

高级水平: 1.能对需求进行架构设计,选择框架以适应最合适的业务,作为某个项目的领导,带领团队完成项目。 2.有自己的开源项目,可以写出自己的组件,对开源的框架能够进行二次编写,java核心技术有…

Autorize插件的使用方法

在Proxy或者Repeater有Request请求包后,要ctrlA全选,然后再右键发送到Autorize插件中: 如果只是像这样空白的发送是不会发送过去的:

粉丝提问:求问大神您会查exif吗?

无需下载安装任何软件,直接上传图片即可查看EXIF。支持JPEG、TIFF、CR2、NEF、XMP等多种图片格式破解Canon、

linux和windows的分区区别,Linux分区与Windows分区的区别

打开开始-管理工具-计算机管理,如下图所示:在Windows系统中,计算机的分区是用磁盘0,磁盘1,磁盘2,磁盘3来表示多块硬盘的,比如磁盘0表示第一块硬盘,磁盘2表示第二块硬盘,以…

一个用于伪造IP地址进行爆破的BurpSuite插件:BurpFakeIP

BurpFakeIP介绍 一个用于伪造ip地址进行爆破的BurpSuite插件,burpsuite伪造ip可用于突破waf及进行安全规则绕过等场景;昨天我们分享了《BurpSuite IP代理扩展,使用AWS API网关动态更改请求:IPRotate_Burp_Extension》有同学也发现…