爬虫实例(一)

1.京东商品页面的爬取

https://item.jd.com/2967929.html

爬虫实例(一)_第1张图片

代码:

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

"""
结果如下:


<html lang="zh-CN">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=gbk" />
    <title>【华为荣耀8】荣耀8 4GB+64GB 全网通4G手机 魅海蓝【行情 报价 价格 评测】-京东title>
    <meta name="keywords" content="HUAWEI荣耀8,华为荣耀8,华为荣耀8报价,HUAWEI荣耀8报价"/>
    <meta name="description" content="【华为荣耀8】京东JD.COM提供华为荣耀8正品行货,并包括HUAWEI荣耀8网购指南,以及华为荣耀8图片、荣耀8参数、荣耀8评论、荣耀8心得、荣耀8技巧等信息,网购华为荣耀8上京东,放心又轻松" />
    <meta name="format-detection" content="telephone=no">
    <meta http-equiv="mobile-agent" content="format=xhtml; url=//item.m.jd.com/product/2967929.html">
    <meta http-equiv="mobile-agent" content="format=html5; url=//item.m.jd.com/product/2967929.html">
    <meta http-equiv="X-UA-Compatible" content="IE=Edge">
    <link rel="canonical" href="//item.jd.com/2967929.html"/>
        <link rel="dns-prefetch" href="//misc.360buyimg.com"/>
    <link rel="dns-prefetch" href="//static.360buyimg.com"/>
    <link rel="dns-prefetch" href="//img10.360buyimg.com"/>
    <link rel="dns-pre
"""

2.亚马逊商品页面的爬取

https://www.amazon.cn/gp/product/B01M8L5Z3Y

爬虫实例(一)_第2张图片

用类似的代码去爬取,如下图所示:

爬虫实例(一)_第3张图片

可以发现发生了错误,爬取失败,status_code 为503,爬取成功应该返回200。其实已经能够从服务器获得页面相关信息回来,表明爬取失败不是网络问题造成的。在网络爬虫引发的问题及限制这篇博客中,提到服务器可以通过来源审判来拒绝爬虫的访问。

我们知道 Requests 库的两个对象中,返回的 Response 对象包含了请求服务器资源的 Request 对象的所有信息。因此可以通过 Response 对象来查看我们发送请求的相关信息:

这里写图片描述

从 User-Agent 可以看出,我们发出的请求信息已经诚实地告诉服务器,这个请求来自一个 Requests 库的 python 程序。这个不在该服务器的接受范围内,因此爬取失败。

我们可以通过修改头部信息来解决这个问题:

爬虫实例(一)_第4张图片

可以看出,发送请求的头部信息已经更改,爬取成功。其中,’Mozilla/5.0’表明请求来自于某个浏览器(火狐等)。

完整代码如下:

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.encodint = r.apparent_encoding
    print(r.text[1000:2000])
except:
    print("爬取失败")

3.百度/360搜索关键字提交

如何利用程序自动向搜索引擎提交关键词并获得搜索结果呢?百度和360都提供了提交关键词的接口,如下图所示,我们只需要通过改变 keyword 来构造 url,便可以提交我们想搜索的关键词并获取相关信息了。

爬虫实例(一)_第5张图片

百度搜索代码:

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("爬取失败")

"""
结果:
wdir='C:/Users/ChenJX/Desktop/爬虫')
http://www.baidu.com/s?wd=Python
271918
"""

360搜索代码:

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

"""
结果如下:
https://www.so.com/s?q=Python
302893
"""

4.网络图片的爬取和存储

【网络图片链接的格式:http://www.example.com/picture.jpg】
用下面这个图片链接作为例子:
http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg

爬虫实例(一)_第6张图片

代码如下:

import requests, os
url="http://image.nationalgeographic.com.cn/2017/0211/20170211061910157.jpg"
root = "C:/Users/ChenJX/Desktop/爬虫"
# url.split('/')[-1]表示以符号'/'分割url字符串,并返回最后一个
# 分割后得到多个子字符串,返回最后一个即返回图片名称
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)
        # 打开该文件,'wb'表以'写二进制'的模式打开
        # (可以进行写操作,写的是二进制形式)
        with open(path, 'wb') as f:
            # r.content 返回的是响应内容的二进制形式
            f.write(r.content)      
            f.close()
            print("文件保存成功")
    else:
        print("文件已存在")
except:
    print("爬取失败")

"""
结果如下:
文件保存成功
"""

同时可以看到该图片已经保存在相应的目录下:

爬虫实例(一)_第7张图片

5.IP地址归属地的自动查询

下图是查询 IP 地址归属地的页面,我们只需要传入 ipaddress 这个参数、构造一个 url,就可以查询归属地。
爬虫实例(一)_第8张图片

代码如下:

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("爬取失败")
"""
结果如下:
value="查询" class="form-btn" />
                                        form>
                                div>
                                <div class="query-hd">ip138.com IP查询(搜索IP地址的地理位置)div>
                                <h1 class="query">您查询的IP:202.204.80.112h1><p class="result">本站主数据:北京市海淀区 北京理工大学 教育网p><p class="result">参考数据一:北京市 北京理工大学p>

                        div>
                div>

                <div class="footer">
                        <a href="http://www.miitbeian.gov.cn/" rel="nofollow" target="_blank">沪ICP备10013467号-1a>
                div>
        div>

        <script type="text/javascript" src="/script/common.js">script>body>
html>
"""

你可能感兴趣的:(Python,Learning,爬虫)