爬虫的问题
1、爬虫的尺寸
爬取网页:小规模,数据量小,——requests库
爬取网站:中规模,数据规模较大,爬取速度敏感,scrapy库
爬取全网:大规模,搜索引擎,爬取数据,定制开发,像谷歌背后等
网络爬虫的法律风险,服务器上的数据产权所有
服务器限制网站爬虫:
1、来源审查:判断User_Agent进行限制
检查来访问http协议头的User_Agent域,只响应浏览器或友好爬虫访问
requests.get(url,headers=)
2、发布公告
告知爬虫网站的爬取策略
Robots协议:网络爬虫排除标准
作用:高数爬虫网站那些可以抓,那些不行
形式:在网站根目录下的robots.txt文件
https://www.jd.com/robots.txt
http://baidu.com/robots.txt
约束性:爬虫可以不遵守,但是有法律风险,类人类行为可不参考robots协议
爬虫实例
1、爬取京东商品
https://item.jd.com/100003800400.html
import requests
r=requests.get("https://item.jd.com/100003800400.html")
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[:1000])
2、爬取亚马逊图书
kv={'user-agent':'Mozilla/5.0'}告诉亚马逊我的头部user-agent为Mozilla/5.0
import requests
url="https://www.amazon.cn/dp/B01NAS120J?_encoding=UTF8&ref_=pc_cxrd_658390051_bestTab_658390051_a_best_1&pf_rd_p=08a249ad-ca97-4ee4-8ad2-61ba933d7738&pf_rd_s=merchandised-search-5&pf_rd_t=101&pf_rd_i=658390051&pf_rd_m=A1AJ19PSB66TGU&pf_rd_r=2GKXC26DSGKGFW09N6Y5&pf_rd_r=2GKXC26DSGKGFW09N6Y5&pf_rd_p=08a249ad-ca97-4ee4-8ad2-61ba933d7738"
try:
kv = {'user-agent': 'Mozilla/5.0'}
r=requests.get(url,headers=kv)
r.raise_for_status()
r.encoding=r.apparent_encoding
print(r.text[1000:2000])
except:
print("爬取失败")
3、百度/360搜索引擎关键词提交
搜索引擎关键词提交接口
百度的关键词接口:
http://www.baidu.com/s?wd=keyword
360的关键词接口:
http://www.so.com/s?q=keyword
在这两个接口中只要替换keyword就可以提交关键词
百度搜索全代码
import requests
try:
kv={"wd":"python"}
r=requests.get("http://www.baidu.com/s",params=kv)
print(r.request.url)
r.raise_for_status()
print(len(r.text))
except:
print("爬取失败")
360
kv={'q':keyword}
http://www.so.com/s
4、网络图片耳朵爬取和存储
(对网站上的任何二进制数据都可以爬取)
网络图片链接的格式:http://www.example.com/picture.jpg
国家地理:
http://www.nationalgeographic.com.cn/
爬取图像简单代码
import requests
url="https://gss1.bdstatic.com/-vo3dSag_xI4khGkpoWK1HF6hhy/baike/crop%3D0%2C420%2C730%2C800/sign=91d0d399adcc7cd9ee626e9904310d0b/bf096b63f6246b60314c7a00e5f81a4c510fa200.jpg"
path="E:/picture/abc.jpg"
r=requests.get(url)
r.status_code
with open(path,'wb') as f:
f.write(r.content) #r.content可以返回图片的二进制形式
f.close()
爬取全代码
import requests
import os
url="http://www.pptbz.com/pptpic/UploadFiles_6909/201203/2012031220134655.jpg"
root="E:/picture"
path=root+url.split('/')[-1]#为[-1]则只保留最后一个 /后面的内容,自动删掉 /前面内容
try:
if not os.path.exists(root):
os.mkdir(root)
if not os.path.exists(path):
r=requests.get(url)
with open(path,'wb') as f:
f.write(r.content)
f.close()
print("文件保存成功")
else:
print("文件已存在")
except:
print("获取失败")