网络爬虫的尺寸

爬取网页 玩转网站 爬取网站 爬取系列网站 爬取全网
小规模,数据量小,爬取速度不敏感 Requests库 中规模,数据规模较大,爬取速度敏感 Scrapy库 大规模,搜索引擎,爬取速度关键,只能定制开发

网络爬虫带来的问题

  • 对服务器的性能骚扰,消耗Web服务器的资源开销
  • 服务器上的数据有产权归属,可能带来法律风险
  • 爬虫可能具备突破简单访问控制的能力,获得被保护数据从而泄露个人隐私

网络爬虫的两种限制

  1. 判断User-Agent进行限制

    检查来访的HTTP协议头的User-Agent域,只响应浏览器或友好爬虫访问

  2. 发布Robots协议

    告知所有爬虫网站的爬虫策略,要求爬虫遵守

Robots协议 (网络爬虫排除标准)

作用:网站告知爬虫哪些页面可以抓取,哪些不行

形式:在网站的根目录下的robots.txt文件

语法:User-agent请求的是谁 Disallow不允许的位置 /代表根目录 *代表所有

网络爬虫先自动或人工识别roboot.txt,再进行内容爬取,如果不遵守协议可能带来风险,商业利益必须遵守

类人行为可以不参考Robots协议(不对服务器进行骚扰)

1
2
3
4
5
6
7
8
9
10
11
12
13
案例1:爬取京东的某件商品
# 爬取京东的某件商品
# url = https://item.jd.com/48918974270.html

import requests
url = "https://item.jd.com/48918974270.html"
try:
r = requests.get(url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[:1000])
except:
print("爬取失败")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
案例2:模拟浏览器的请求头访问亚马逊商品
# 模拟浏览器头部访问亚马逊商品

import requests
url = "https://www.amazon.cn/gp/product/B01M8L5Z3Y"
try:
# 模拟浏览器头部信息
kv = {'user-agent': 'Mozilla/5.0'}
r = requests.get(url, headers = kv)
print("头部信息为:\n", r.request.headers) # 注意request没有s
r.raise_for_status()
r.encoding = r.apparent_encoding
print("爬取结果为:\n", r.text[1000:2000])
except:
print("爬取失败")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
案例3:百度搜索关键词
# 通过百度搜索关键词信息

import requests
url = "https://www.baidu.com/s"
try:
kv = {'wd': 'Python'}
r = requests.get(url, params = kv)
print("url地址为:", r.request.url)
r.raise_for_status()
r.encoding = r.apparent_encoding
print("所有信息的长度为:\n", len(r.text))
except:
print("爬取失败")
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
案例4:爬取图片并保存在本地(注意路径)
# 图片的爬取
import requests
import os

url = "http://photocdn.sohu.com/20151027/Img424310423.jpg"
root = "D://PyCharm_file//workplace//images//"
path = root + url.split('/')[-1]
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r = requests.get(url)
# print(r.status_code)
print(path)
with open(path, "wb") as f:
f.write(r.content) #二进制写
f.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("爬取失败")
1
2
3
4
5
6
7
8
9
10
11
案例5:通过网站API查询IP地址
# 通过网站的API查询ip地址
import requests
url = "http://m.ip138.com/ip.asp?ip="
try:
r = requests.get(url + '202.204.80.112')
r.raise_for_status()
r.encoding = r.apparent_encoding
print(r.text[-500:])
except:
print("爬取失败")