爬虫入门(一)


网络爬虫之规则

requests库安装

安装:pip install requests

遇到的问题:

当我在cmd中输入pip install requests之后,却返回了:Requirement already satisfied,然后我顺着后面的提示,在c盘中的anaconda3中的第三方库中找到了requests库但是我用python自带的IDLE测试安装结果的时候,却失败了。

解决方法:

直接打开pycharm,新建.py文件,然后直接import requests,软件会自动提示没有这个库,根据提示,点击安装就行了,因为这种情况正常安装好像无法安装上,没想到用这个办法却实现了(^▽^)。

requests库的七个主要方法

方法 说明
requests.request() 构造一个请求,支撑以下各方法的基础方法
requests.get() 获取HTML网页的主要方法,对应于HTTP的GET
requests.head() 获取HTML网页头信息的方法,对应于HTTP的HEAD
requests.post() 向HTML网页提交POST请求的方法,对应于HTTP的POST
requests.put() 向HTML网页提交PUT请求的方法,对应于HTTP的PUT
requests.patch() 向HTML网页提交局部修改请求,对应于HTTP的PATCH
requests.delete() 向HTML页面提交删除请求,对应于HTTP的DELETE

requests库的get()方法

.png)

.png)

.png)

response对象的属性

.png)

.png)

爬取网页的通用代码框架

import requests

def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()#如果状态不是200,引发HTTPError异常
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return "产生异常"

if __name__=="__main__":
    url=input()
    print(getHTMLText(url))

HTTP协议对资源的操作

方法 说明
GET 请求获取URL位置的资源
HEAD 请求获取URL位置资源的响应消息报告,即获得该资源的头部信息
POST 请求向URL位置的资源后附加新的数据
PUT 请求向URL位置存储一个资源,即改变该处资源的部分内容
PATCH 请求局部更新URL位置的资源,即改变该处资源的部分内容
DELETE 请求删除URL位置存储的资源

网络爬虫引发的问题

  • 性能骚扰
  • 法律风险
  • 隐私泄露

网络爬虫的尺寸

.png)

网络爬虫的限制

.png)

Robots协议

作用:

​ 网站告知网络爬虫哪些页面可以抓取,哪些不行

形式:

​ 再往站根目录下的robots.txt文件

真实的网络robots协议:

http://www.baidu.com/robots.txt

http://news.sina.com.cn/robots.txt

http://www.qq.com/robots.txt

http://news.qq.com/robots.txt

http://www.moe.edu.cn/robots.txt (无robots协议)

使用:

  • 网络爬虫:自动或人工识别robots.txt,再进行内容爬取
  • 约束性:robots协议是建议但非约束性,网络爬虫可以不遵守,但存在法律风险
  • 原则:类人类行为可不参考robots协议

实例一:京东商品页面的爬取

import requests
url="https://item.jd.com/2391981.html"
try:
    r=requests.get(url)
    r.raise_for_status()
    r.encoding=r.apparent_encoding
    print(r.text[:1000])
except:
    print("爬取失败")

实例二:亚马逊商品页面的爬取

import requests
url="https://www.amazon.cn/gp/product/B01M8L5Z3Y"
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)
except:
    print("爬取失败")

实例三:百度360搜索关键词提交

360搜索:

import requests
keyword="Python"
try:
    kv={'q':keyword}
    r=requests.get("http://www.so.com/s",params=kv)
    print(r.request.url)
    r.raise_for_status()
    print(len(r.text))
except:
    print("爬取失败")
import requests
keyword="Python"
try:
    kv={'wd':keyword}
    r=requests.get("http://www.baidu.com/s",params=kv)
    print(r.request.url)
    r.raise_for_status()
    print(len(r.text))
except:
    print("爬取失败")

ps:经过两个的爬取结果分析,发现360的robots协议居然那么友好,诶,百度的robots协议就不行了啊,各种限制

网络图片的爬取和存储

import requests
import os
url="http://pic.netbian.com/uploads/allimg/190824/212516-15666531161ade.jpg"
root="F:/Picture/"
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)
        with open(path,'wb') as f:
            f.write(r.content)
            f.close()
            print("文件保存成功")
    else:
        print("文件已存在")
except:
    print("爬取失败")

IP地址归属地的自动查询

import requests
url="http://m.ip138.com/ip.asp?ip="
try:
    r=requests.get(url+'118.89.134.177')
    r.raise_for_status()
    r.encoding=r.apparent_encoding
    print(r.text[-500:])
except:
    print("爬取失败")

参考资料

https://www.icourse163.org/learn/BIT-1001870001?tid=1206951268#/learn/content


文章作者: Amonologue
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Amonologue !
  目录