Python网络爬虫与信息提取笔记03-Requests库网络爬虫实战(5个实例)

 Python网络爬虫与信息提取笔记01-Requests库入门

Python网络爬虫与信息提取笔记02-网络爬虫之“盗亦有道”

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

1、首先我们打开京东商城页面,选择一个商品,找到它的url连接,如:https://item.jd.com/100009177374.html

2、下面我们打开IDLE-->New File,并导入Requests库,使用get方法并获取返回状态码

>>> import requests
>>> r = requests.get("https://item.jd.com/100009177374.html")
>>> r.status_code
200

3、状态码200表示连接状态正确,再来查看编码信息

r.encoding

这说明京东网站提供页面信息的相关编码

4、下面再来查看返回页面是否正确,

返回了页面内容的正确信息,表示成功。

我们之前也说到,网页爬取有一个标准框架,我们这个爬取的框架是什么呢?来看一下:

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

赶快去试一下吧。

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

1、首先我们打开亚马逊中国,随便找到一个商品,这是一个耳机:https://www.amazon.cn/dp/B07CKT8Z57/ref=lp_1397649071_1_1?s=music-players&ie=UTF8&qid=1580539992&sr=1-1

我们发现这个链接比京东的复杂一些

2、打开IDLE,导入Requests库,抓取页面发现返回的状态码为503,出现了错误。

>>> r = requests.get("https://www.amazon.cn/dp/B07CKT8Z57/ref=lp_1397649071_1_1?s=music-players&ie=UTF8&qid=1580539992&sr=1-1")
>>> r.status_code
503
>>> 

我们查看编码方式并转换为备用编码方式,但是,返回的页面我们发现还是出现了错误,回想前面的, 有些网站对网络爬虫是由一定的限制的,那么网站怎样自动识别是不是机器爬虫来完成的,这就要看发送的请求头部了

3、我们查看一下我们爬虫发送request请求对象的头部信息,我们可以看到其中有个‘User-Agent’:‘python-requests/2.22.0’,还记得第二节盗亦有道讲到的爬虫规范嘛,这相当于明确告诉亚马逊网站,我是爬虫发送的请求,所以遭到了拒绝

4、可是我们之前还学了更改头部信息,就是用字典添加键值对来完成的,这里我们给头部更换为‘Mozilla/5.0’,这表示这是一个标准的正常浏览器请求,其实也可设置明确的火狐,谷歌浏览器名称,此时再去请求,返回的状态码就是200了。

5、此时我们验证请求对象头部已经改变,且返回的信息也已经没有提示错误了

下面我们来看这个代码的全框架:

import requests
url = "https://www.amazon.cn/dp/B07CKT8Z57/ref=lp_1397649071_1_1?s=music-players&ie=UTF8&qid=1580539992&sr=1-1"
try:
    kv = {'User-Agent':'Mozilla/5.0'}
    r= request.get(url,headers = kv)
    r.raise_for_status()
    r.encoding = r.apparent_encoding
    print(r.text[:1000:2000])
except:
    print("爬取失败")

这里,跟京东页面的爬取不太一样,因为我们要做一个头部处理,这对网站保护性比较好的网站也可以张确的获取到信息。

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

百度和360搜索我们都很清楚,但是有没有这样一种可能,用程序向这两个搜索引擎提交两个关键词,并且我们能搜索到它的结果呢?

搜索引擎关键词提交接口

  • 百度的关键词接口:http://www.baidu.com/s?wd=keyword
  • 360的关键词接口:http://www.so.com/s?q=keyword

我们只需要在这两个url将我们想要的关键词替换掉keyword,就可以向搜索引擎提交关键词了。

还记得吗?我们之前提到有一个params字段,它可以向url字段中增加相关内容。

1.首先我们来构造一个键值对,假设我们要搜索的关键词是python,且假设我们用360的搜索来试一下

>>> import requests
>>> kv = {'q':'python'}
>>> r = requests.get("http://www.so.com/s",params = kv)
>>> r.status_code
200
>>> 

此时,我们已经提交了请求,

2.接下来,使用response对象中包含的request的对象的信息,这个url表示我们向搜索引擎提交用来搜索关键词python的url

我们还可以来查看一下返回的内容的信息,先不要打印,我们来看一下长度:

>>> len(r.text)
365484
>>> 

这里表示我们用这条url提交的搜索请求返回的结果包含365k左右的信息。

如果你是想用百度的搜索引擎来尝试一下,只需要将代码中的q替换成wd,结果应该是这样的:

'http://www.baidu.com/s?wd=Python'

至于怎么筛选我们所需要的的有用信息,我们后面再说。

下面给出这一个实例的代码框架:

import requests
keyword = 'Python'
try:
    kv = {'q':keyword}
    r = requests.get("http://www.baidu.com/s,params = kv)
    print(r.status_code)
    r.raise_for_statude()
    print(len(r.text))
except:
    print("获取失败")

实例4:网络图片的爬取和存储

  • 网络图片的爬取

网络图片链接格式:http://www.example.com/picture.jpg

比如国家地理:http://www.nationalgeographic.com.cn/

我们随机选择一个图片,看下面这张图片的链接,这样的一个.jpg格式就是表示这是一个图片链接且是文件类型的,我们要做的就是利用python将它爬取出来,并保存到本机

http://image.ngchina.com.cn/2020/0120/20200120023057518.jpg

1、首先我们导入requests库,并且需要指定保存路径和名称

2、接着我们使用get方法请求连接,并返回状态码

3、最后我们需要将返回的二进制数据生成一个jpg文件,

这段代码含义是首先我们打开一个文件,path就是这个abc.jpg文件,并且定义为文件标识符f(as相当于别名),然后将其二进制数据写进文件中(r.content表示文件的二进制形式),并关闭。

我们打开E盘发现,图片已经下载出来了。

下面我们给出全代码:

import requests
import os    
url = "http://image.ngchina.com.cn/2020/0120/20200120023057518.jpg"
root = "D://pics//"    # 定义根目录
# 文件路径标示为url链接最后一段,即jpg文件,这样就可以不用指定名称,原名保存
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("爬取失败")

事实上,想要实现这样一个功能的代码很简单,但是如果不规范代码的要求那就不能作为产品给用户使用,这也是做工程时的一个比较高的要求,所以一定要重视每个实例后标准的代码框架,培养代码规范的好习惯。

实例5:IP地址归属地的自动查询

既然要查询IP地址我们需要有一定的库来支持,但遗憾的是并没有这样一个库来支持IP地址查询。

但是我们发现一个网站,可以提供类似的功能:http://m.ip138.com/,它的主页是这样的,

但是这种界面是人机交互性的界面,即人来输入,然后点击查询,但是对于一段自动代码这是不好的,这里教给大家一个小技巧,比如这个网站,我们在查询时,注意观察网页地址的变化,

可以发现,网站并没有对提交的IP地址进行大的处理,简单将其附在原来的url中,这种url接口就可以通过提交的IP参数来实现查询并返回查询到的信息。

1、首先,我们导入requests库,然后用url变量来表示我们所解析到的url接口

2、接着,我们用变量r提交一个IP地址,并检测状态码

3、最后我们只展示返回信息的最后500个字节来查看结果:

可以看到,这是北京理工大学教育网首页。

这里在讲一个小技巧,有时我们使用PythonIDLE的交互式的形式来编写代码时,如果返回的信息数据很大时,有可能会不能正常输出,所以我们这里截取最后的500字符,这样可以高效的得到输出结果信息。

下面给出全代码:

# IP地址查询全代码
import requests
url = "http://m.138.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("获取失败")

好了,五个特别简单的实例有木有,大家一定要亲手写一下,并且按照代码规范来写,这样,才能更快进步哦!!!加油。

猜你喜欢

转载自blog.csdn.net/MARS_098/article/details/104133535