Python教程

Python网络爬虫(一)

本文主要是介绍Python网络爬虫(一),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!

网络爬虫之规则

requests库入门

requests的get方法

  1. r = requests.get(url)
    构建一个request对象向服务器请求资源,返回一个包含服务器资源的response对象。

requests.get(url, parm, *kwags)
url:网页的url链接
parm:url中的额外参数,字典或字节流的格式,可选
kwags:12个控制访问的参数

  1. Response对象
    Response对象的属性:
属性 说明
r.stauts_code HTTP请求的返回状态200表示成功,其他数值则是失败
r.text HTTP请求的相应内容,是字符串形式,也即url页面内容
t.encoding 从HTTPheader中猜测的编码方式
r.apparent_encoding 从返回内容中分析的编码方式
r.content HTTP响应内容的二进制形式

r.encoding和r.apparent_encoding的区别:有的服务器对编码是有要求的则header中会有charset字段,如果没有则默认为ISO-8859-1,而apparent_encoding则是分析内容来解析信息。

爬取网页的通用代码框架

  1. 理解request库的异常
异常 说明
requests.ConnectionError 网络连接错误,如DNS无效,域名无效等
requests.HTTPError HTTP、异常
requests.URLError URL异常
requests.ConnectTimeout 服务器连接超时
requests.Timeout URL请求超时
r.raise_for_status() 若r.status_code返回不是200,则产生HTTPError
  1. 常用框架
import requests
def getHTMLText(url):
	try:
		r = requests.get(url)
		r.raise_staus_code()
		r.encoding = r.apparent_encoding
		return r.text
	except:
		return "产生异常"

HTTP协议和requests库的主要方法

  1. HTTP(Hypertext Transfer Protocol):超文本传输协议,是基于请求与相应模式的、无状态(请求之间无关联)的应用层协议。
  2. URL格式:http:// host[:port][path]
    host:Internet主机域名或IP地址
    port:端口号,默认为80
    path:请求资源的路径
    http://www.bit.edu.cn
    URL是一个在Internet上存储资源的路径。
HTTP协议方法 requests库 说明
GET requests.get() 获取资源
HEAD requests.head() 获取资源的头部信息
PUT requests.put() 在URL对应的资源后添加资源
POST requests.post() 对URL的资源进行覆盖
PATCH requests.patch() 对URL的部分内容更新
DELETE requests.delete() 删除URL的资源

patch和put的区别,patch是将部分资源进行局部更新,而put则是全覆盖,没有更新的自动做删除处理。

Requests 库主要方法解析

requests.request(method, url, **kwags)

method:方法的参数即包含GET等等。而get等方法即已经得到封装的request方法。
url:URL链接
**kwags:12个参数,分别实现不同功能

12个参数

  1. params:字典或字节序列,作为参数加到URL后面
kv = {'key1':'vaule1','key2':'vaule2'}
r = requests.request('GET',"https:/python123.io/ws", params = kv)
>>> "https:/python123.io/ws?key1=vaule1&key2=vaule2"
  1. data:字典或字节序列或文件对象,作为request的内容传递给服务器
kv = {'key1':'vaule1','key2':'vaule2'}
r = requests.request('POST',"https:/python123.io", data = kv)
  1. json:json格式的内容,作为数据传递给服务器
kv = {'key1':'value1'}
r = requests.request('POST',"https:/python123.io", json=kv)
  1. headers:字典类型,属于HTTP协议的定制头
hd = {'user-agent':'chrome/10'}
r = requests.request('GET', 'https:/python123.io', headers=hd)
  1. cookies:字典或CookieJAR,Requests中的Cookie
  2. auth:元组,支持HTTP的认证功能
  3. file:字典类型,传输文件
fi = {'file': open('data.txt','rb')}
r = requests.request('POST','https:/python123.io', files=fi)
  1. timeout:设置超时时间,以秒为单位
r = requests.request('GET', 'https:/python123.io', timeout=10)
  1. proxies:字典类型,设定代理服务器,可以增加登陆验证,可用于重定向访问IP以保护爬虫隐私
px = {'HTTP':'http://user@10.10.1.1234'\
	  'HTTPS':'https://1.0.1.0.4321'}
r = requests.request('GET', 'https:/python123.io', proxies = px)
  1. allow_redirects:True/False,默认为True,设置是否允许重定向
  2. stream:True/False,默认为True,设置是否获取内容立即下载开关
  3. verify:True/False,默认为True,认证SSL证书开关
  4. cert:本地SSL证书路径

网络爬虫的“盗亦有道”

网络爬虫引发的问题

  1. 爬取网页:使用requests库即可,小规模,数据量小
  2. 爬取网站和系列网站:使用scrapy库,中规模,数据量较大
  3. 爬取全网:即搜索引擎,只能定制开发
    某些爬虫会对服务器造成大量的资源开销。
    同时存在法律风险,数据是有所有者。
    可能给个人隐私带来很大的风险。

对网络爬虫进行限制:

  1. 可以对协议头进行限制,只允许headers中的user_angent是浏览器和允许的友好爬虫进行访问。
  2. 发布Robot协议,要求爬虫遵守相应的规定。

Robots协议

在网站的根目录下写一个叫Robots.txt的文件。
如果没有Robots.txt文件,则表示网站允许所有爬虫爬取所有的内容。

user_agent: #这里表示爬虫的名字,全部则为*
disallow: # 这里表示不允许爬取的目录,全部则为/ 表示根目录

Robots协议的遵守方式

网络的爬虫应该能自动识别并遵守Robots协议。如果不遵守,则存在法律风险。
对服务器的访问一天只存在几次访问,类似于人类的行为,则原则上可以不遵守Robots协议。

5个实例

  1. 京东商品信息爬取
import requests
url = "https://item.jd.com/2967929.html"
try:
    r = requests.request('GET', url, headers = {'ueser-agent':'chrome/12'})
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[:1000])
except:
    print("访问出错")

注意:京东商品被限制需要登陆才能爬取,所以这里应该是得不到结果的。
2. 亚马逊商品爬取

import requests
url = 'https://www.amazon.cn/dp/B0864LWWX9/ref=lp_665002051_1_2'
try:
    r = requests.request('GET', url, headers={'user-agent':'Nozilla/5.0'})
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[:1000])
except:
    print('爬取错误')

注意:亚马逊商品的爬取因为有保护,必须要修改user-agent才能进行访问
3. 百度和360爬取

import requests
url1 = "http://www.baidu.com/s"
url2 = "http://www.so.com/s"
keyword1 = {'wd':'python'}
keyword2 = {'q':'python'}
try:
    r1 = requests.request('GET', url1, params = keyword1)
    r2 = requests.request('GET', url2, params = keyword2)
    print(r1.request.url)
    print(r2.request.url)
    r1.raise_for_status()
    r2.raise_for_status()
    r1.encoding = r1.apparent_encoding
    r2.encoding = r2.apparent_encoding
    print(r1.text[:1000])
    print(r2.text[:1000])
except:
    print("爬取失败")

注意:百度和360最后的格式分别是 "/s?wd = keyword"和"/s?q = keyword",所以可以使用params进行直接在URL后的操作
4. 图片下载

import requests
import os
url = "https://w.wallhaven.cc/full/pk/wallhaven-pkkm6p.png"
root ="C://Users//ADM//Pictures//"#其实用的是默认图片路径涉及隐私所以改了一点
path = root + url.split('/')[-1]
try:
    if not os.path.exists(root):
        os.mkpath(root)
    if not os.path.exists(path):
        r = requests.request('GET', url)
        with open(path, 'wb') as f:
            f.write(r.content)
            f.close()
    else:
        print("file has already existed!")            
except:
    print("ERROR!")

需要注意:图片是二进制文件,必须要用r.content来返回。然后就是必须事先建立好文件,然后再进行写入操作。
5. IP地址的查询

import requests
IP = "202.204.80.112"
url = "https://m.ip138.com/iplookup.asp?ip="
try:
    r = requests.request('GET',url+IP, headers= {'user-agent':'chrome/10'})
    print(r.request.url)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[2400:2500])
except:
    print("爬取错误!")

这里要注意,也要对协议头中的user-agent字段进行修改,否则爬取不成功。


以上内容来自北京理工大学嵩天老师及其团队的《Python网络爬虫与信息提取》课程第一周的内容。
非常感谢嵩天老师及其团队给我们带来这样优质的课程。
课程链接

这篇关于Python网络爬虫(一)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!