爬虫学习与爬虫实践

环境python 3

anaconda

pip

以及各种库

1.requests库的使用

主要是如何获得一个网页信息

重点是

r=requests.get("https://www.google.com/?hl=zh_CN")
这里是爬取了谷歌主页(科学上网)可以换成其他页面爬取
import requests
r=requests.get("https://www.google.com/?hl=zh_CN")
print(r.status_code)
r.encoding='utf-8'
print(r.text)

  这里是代码部分,requests.get获得了一个网页的信息,存入r中

这个时候使用r.status_code如果返回200则证明调用成功,404表示失败,其实不是200就是失败

r.text是响应内容的字符串形式

r.encoding是从http header中猜测的响应内容编码方式(如果header中不存在charset,则认为编码方式为ISO-8859-1,这个时候就需要改为备选编码中的编码形式)

r.apparent_encoding 是从内容中分析出的响应内容编码方式(其实较为准确)

r.content 相应内容的二进制形式(比如获取图像时使用)

异常处理

r.raise_for_status() 如果不是200,产生异常requests.HTTPError

加入异常处理后形成了一个爬取网页的通用代码框架(使得爬取更稳定)

如下:

import requests

def getHTMLText(url):
    try:
        r=requests.get(url,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        return r.text
    except:
        return "产生异常"

if __name__=="__main__":
    url="http://www.baidu.com/"
    print(getHTMLText(url))

为理解这个库,需要理解HTTP

HTTP:Hypertext Transfer Protocol,超文本传输协议

HTTP对数据的操作与request库是对应的

通过URL获得资源

head方法可以通过较少的流量获得大概信息

requests.request(method,url,**kwargs)  最后一个参数可以省略

最常使用的还是get和head,主要是get

关于爬虫的量级

1.小规模,数据量小,爬取速度不敏感,爬取网页,玩转网页为目的的 这个时候使用requests库就可以满足

2.中规模,数据规模较大,爬取速度敏感,爬取网站,爬取系列网站 Scrapy库

3.爬取全网,大规模,搜索引擎比如百度,google,爬取速度关键,这一类的爬虫是定制开发的而非第三方库

下面是实践部分,有一些网站有反爬机制,比如亚马逊,所以需要改动我们的user-agent进行伪装,代码如下:

import requests

def getHTMLText(url):
    try:
        # 更改头部信息,模拟成一个浏览器
        kv = {'user-agent': 'Mozilla/5.0'}
        r=requests.get(url,headers=kv,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        print(r.request.headers)

        return r.text[:1000]
    except:
        return "产生异常"

if __name__=="__main__":
    url="https://www.amazon.cn/dp/B07FDT8P6C/ref=cngwdyfloorv2_recs_0?pf_rd_p=d2aa3428-dc2b-4cfe-bca6-5e3a33f2342e&pf_rd_s=desktop-2&pf_rd_t=36701&pf_rd_i=desktop&pf_rd_m=A1AJ19PSB66TGU&pf_rd_r=G32Y9X81496BTATWRG3A&pf_rd_r=G32Y9X81496BTATWRG3A&pf_rd_p=d2aa3428-dc2b-4cfe-bca6-5e3a33f2342e"
    print(getHTMLText(url))

 包含搜索的百度爬虫代码,期中kv_word是提交的输入关键词,最终返回获得的信息数量,每次略有差别,我随便一次为319295:

import requests

def getHTMLText(url):
    try:
        # 更改头部信息,模拟成一个浏览器
        kv_head = {'user-agent': 'Mozilla/5.0'}
        kv_word={'wd':'Python'}
        r=requests.get(url,params=kv_word,headers=kv_head,timeout=30)
        r.raise_for_status()
        r.encoding=r.apparent_encoding
        print(r.request.url)

        return len(r.text)
    except:
        return "产生异常"

if __name__=="__main__":
    url='https://www.baidu.com/s'
    print(getHTMLText(url))

 

猜你喜欢

转载自www.cnblogs.com/wangziyan/p/10498780.html
今日推荐