爬虫入门(1)——requests库

一、requests拓展包的安装

1、直接在终端执行下面命令,报错。
pip3 install requests
2、查看报错原因,里面有一句。估计是网络问题。
raise ReadTimeoutError(self._pool, None, 'Read timed out.')
3、在命令中增加响应时长后执行成功。
pip3 install requests --default-timeout=1000
# 运行结果
Successfully installed certifi-2020.6.20 chardet-3.0.4 idna-2.10 requests-2.24.0 urllib3-1.25.10

二、requests的基本操作

1、基本get请求
r = request.get(url)
2、通过get方法传递参数,参数直接放在url中。
# 参数直接放在url中
# tips: http://httpbin.org能够用于测试http请求和响应
>>> r = requests.get('http://httpbin.org/get?name=zhangsan&name=22')
# 参数放在get方法中
>>> data = {'name':'zhangsan','age':22}
>>> r = requests.get('http://httpbin.org/get',params='data')
>>> r.url
'http://httpbin.org/get?name=zhangsan&name=22'
3、添加请求头header

添加请求头可以使requests发送的请求,在服务器看来是由浏览器发送的。

>>> headers={'user-agent':'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/58.0.3029.110 Safari/537.36 SE 2.X MetaSr 1.0','Host':'www.baidu.com'}
>>> r=requests.get('http://www.baidu.com',headers=headers)
>>> r.status_code
200
4、基本post方法

在使用post发送请求时,密码不会显示在url中,数据字典在发送时会自动编码为表单形式。

>>> key_dict = {'key1':'value1','key2':'value2'}
>>> r = requests.post('http://httpbin.org/post',data = key_dict)
>>> r.url
'http://httpbin.org/post'
5、超时报错

响应时间超过设置的timeout就会报错。

>>> r=requests.get('http://www.baidu.com/',timeout=0.11)

三、尝试爬取网页

>>> import requests
>>> r = requests.get('https://www.cnblogs.com/bai2018/p/10957787.html')
# 编码方式
>>> r.encoding
utf-8
# 抓取状态,200成功,4xx客户端错误,5xx服务器错误
>>> r.status_code
200
# 抓获的文本
>>> r.text
# 可展开的结果
Squeezed text(385lines).

四、爬取豆瓣电影TOP50

1、思路

首先我们查看一下豆瓣电影排行榜的网址:

第一页:https://movie.douban.com/top250

第二页:https://movie.douban.com/top250?start=25&filter=

第三页:https://movie.douban.com/top250?start=50&filter=

结合网页的内容,很容易就能从中发现规律。每页25个,我们找TOP50的话,只查前两页就可以了。

首先用requests请求获取页面的html。++接下来,使用正则表达式从html中抽取自己需要的信息并将其存入文本(或直接打印均可)。这一部分既是重点,也是难点。++ 如果正则表达式不够熟悉的话,参考正则表达式菜鸟教程

2、代码

如果想要查询TOP100等等,仅仅需要更改首个for循环中range()的数字即可。
下面的代码还需要用到正则表达式来提取数据,很复杂,后面学会了BeautifulSoup之后提取数据就很方便了。

import requests
# re是python的标准库,用于字符串匹配(正则表达式)
import re

# 每次爬取前先清空里面原有内容,防止程序多次运行导致文本内容冗余
f = open('douban.txt','w')
f.truncate()

# 请求头,伪装成浏览器
headers={
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) '
    'AppleWebKit/537.36 (KHTML, like Gecko) '
    'Chrome/75.0.3770.90 Safari/537.36'
}

base_url='https://movie.douban.com/top250?start={}&filter='

for i in range(2):
    url=base_url.format(25*i)
    print(url)
    # 发送请求
    response=requests.get(url,headers=headers)
    # 通过正则解析提取数据
    # 电影详情页url、图片链接、电影名称、导演、主演、电影上映时间、电影评分、评价人数、简介
    # 正则表达式a.*?b表示在a和b中间可以出现任意多的任意字符,但是这些字符中不能有b,有b就表示结束了
    movie_content_list = re.findall('<div class="item">.*?href="(.*?)">.*?src=".*?"'
                                    ' class="">.*?<span class="title">(.*?)</span>.*?'
                                    '<div class="bd">.*?导演:(.*?)<br>(.*?)</p>.*?'
                                    '<span class="rating_num".*?>(.*?)</span>.*?'
                                    '<span>(.*?)人评价.*?<span class="inq">(.*?)</span>',
                              response.text,re.S)
    # 解压赋值每一部电影
    for movie_content in movie_content_list:
        (detail_url,movie_name,acters,movie_time,movie_grade,number,content) = movie_content
        index = movie_content_list.index(movie_content)
        detail_data=f'序号:{index+25*i+1} 电影名称:{movie_name}, ' \
                    f'电影url:{detail_url}, 导演和主演:{acters},电影上映时间:{movie_time},' \
                    f'电影评分:{movie_grade},评价人数:{number},简介:{content}\n'
        print(detail_data)
        # 保存数据
        with open('douban.txt','a',encoding='utf-8')as f:
            f.write(detail_data)

五、Cookie

1、Session的妙用

requests库的session对象能够帮助我们++跨请求保持某些参数++,也会在++同一个session实例发出的所有请求中保持cookies++。

>>> import requests
>>> s = requests.Session()
# 下面的代码我在别的网站上没实现,只在httpbin才实现了,知道为啥的小伙伴可以评论说一下
>>> s.get('http://httpbin.org/cookies/set/sessioncookie/123456789')
>>> r = s.get('http://httpbin.org/cookies')
>>> print(r.text)
{
  "cookies": {
    "sessioncookie": "123456789"
  }
}

从上面的代码可以看出我们用get获取到了session中的cookie。由于session让请求之间具有了连贯性,那么就有了跨请求参数和非跨请求参数。两者如何区分使用呢?看下面的例子。

>>> import requests
>>> s = requests.Session()
>>> s.headers.update({'test1':'True'})
>>> r1 = s.get('http://httpbin.org/headers', headers = {'test2':'True'})
>>> print(r1.text)  # 打印结果只截取了有用的部分
{
    "Test1": "True", 
    "Test2": "True", 
}
>>> r2 = s.get('http://httpbin.org/headers')
>>> print(r2.text)
{
    "Test1": "True", 
}

总结一下,当我们使用session对象的update方法s.属性.update(数据)时,或者使用cookies的set方法http://httpbin.org/cookies/set/sessioncookie/数据

2、
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值