爬虫抓取网页数据(使用Python写爬虫来爬取十分方便-本文社区 )
优采云 发布时间: 2021-10-11 12:27爬虫抓取网页数据(使用Python写爬虫来爬取十分方便-本文社区
)
本文作者:IMWeb胡庆阳 原文来源:IMWeb社区,未经许可,禁止转载
过去当你需要一些网页的信息时,用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
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,head) # 伪造请求头
response = urllib.request.urlopen(req)
html = response.read().decode('utf-8')
print(html)
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/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 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/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']