爬虫之requests模块(代码片段)

dominic-ji dominic-ji     2022-12-30     489

关键词:

概述

技术分享图片

近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的利益,而网络爬虫是其中最为常用的一种从网上爬取数据的手段。

网络爬虫,即Web Spider,是一个很形象的名字。如果把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛是通过网页的链接地址来寻找网页的。从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。

爬虫的价值

互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息等等,这些数据都代表了各个行业的真金白银,可以说,谁掌握了行业内的第一手数据,谁就成了整个行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏,掌握了爬虫技能, 你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为你提供有价值的数据。

爬虫的基本流程

技术分享图片

预备知识

http协议

requests模块

基本语法

requests模块支持的请求:

1
2
3
4
5
6
7
import requests
requests.get("http://httpbin.org/get")
requests.post("http://httpbin.org/post")
requests.put("http://httpbin.org/put")
requests.delete("http://httpbin.org/delete")
requests.head("http://httpbin.org/get")
requests.options("http://httpbin.org/get")  

get请求

1 基本请求

1
2
3
4
5
import requests
response=requests.get(‘https://www.jd.com/‘,)
 
with open("jd.html","wb") as f:
    f.write(response.content)

2 含参数请求

1
2
3
import requests
response=requests.get(‘https://s.taobao.com/search?q=手机‘)
response=requests.get(‘https://s.taobao.com/search‘,params="q":"美女")

3 含请求头请求

1
2
3
4
5
6
import requests
response=requests.get(‘https://dig.chouti.com/‘,
                      headers=
                         ‘User-Agent‘:‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.3202.75 Safari/537.36‘,
                              
                      )

4 含cookies请求

1
2
3
4
5
6
7
8
import uuid
import requests
 
url = ‘http://httpbin.org/cookies‘
cookies = dict(sbid=str(uuid.uuid4()))
 
res = requests.get(url, cookies=cookies)
print(res.json())

5 request.session()

1
2
3
4
5
6
7
8
9
import requests
 
# res=requests.get("https://www.zhihu.com/explore")
# print(res.cookies.get_dict())
 
session=requests.session()
res1=session.get("https://www.zhihu.com/explore")
print(session.cookies.get_dict())
res2=session.get("https://www.zhihu.com/question/30565354/answer/463324517",cookies="abs":"123"

post请求

1 data参数

requests.post()用法与requests.get()完全一致,特殊的是requests.post()多了一个data参数,用来存放请求体数据

1
response=requests.post("http://httpbin.org/post",params="a":"10", data="name":"yuan")

2 发送json数据

1
2
3
4
5
6
import requests<br>
res1=requests.post(url=‘http://httpbin.org/post‘, data=‘name‘:‘yuan‘) #没有指定请求头,#默认的请求头:application/x-www-form-urlencoed
print(res1.json())
 
res2=requests.post(url=‘http://httpbin.org/post‘,json=‘age‘:"22",) #默认的请求头:application/json)
print(res2.json())

response对象

(1) 常见属性

1
2
3
4
5
6
7
8
9
10
11
12
13
import requests
respone=requests.get(‘https://sh.lianjia.com/ershoufang/‘)
# respone属性
print(respone.text)
print(respone.content)
print(respone.status_code)
print(respone.headers)
print(respone.cookies)
print(respone.cookies.get_dict())
print(respone.cookies.items())
print(respone.url)
print(respone.history)
print(respone.encoding)    

(2) 编码问题

1
2
3
4
5
import requests
response=requests.get(‘http://www.autohome.com/news‘)
#response.encoding=‘gbk‘ #汽车之家网站返回的页面内容为gb2312编码的,而requests的默认编码为ISO-8859-1,如果不设置成gbk则中文乱码
with open("res.html","w") as f:
    f.write(response.text)

(3) 下载二进制文件(图片,视频,音频)

1
2
3
4
5
6
import requests
response=requests.get(‘http://bangimg1.dahe.cn/forum/201612/10/200447p36yk96im76vatyk.jpg‘)
with open("res.png","wb") as f:
    # f.write(response.content) # 比如下载视频时,如果视频100G,用response.content然后一下子写到文件中是不合理的
    for line in response.iter_content():
        f.write(line)

(4) 解析json数据  

1
2
3
4
5
6
7
import requests
import json
 
response=requests.get(‘http://httpbin.org/get‘)
res1=json.loads(response.text) #太麻烦
res2=response.json() #直接获取json数据
print(res1==res2)

(5) Redirection and History

默认情况下,除了 HEAD, Requests 会自动处理所有重定向。可以使用响应对象的 history 方法来追踪重定向。Response.history 是一个 Response 对象的列表,为了完成请求而创建了这些对象。这个对象列表按照从最老到最近的请求进行排序。

1
2
3
4
5
6
7
>>> r = requests.get(‘http://github.com‘)
>>> r.url
‘https://github.com/‘
>>> r.status_code
200
>>> r.history
[<Response [301]>]

另外,还可以通过 allow_redirects 参数禁用重定向处理:

1
2
3
4
5
>>> r = requests.get(‘http://github.com‘, allow_redirects=False)
>>> r.status_code
301
>>> r.history
[]  

应用案例

1、模拟GitHub登录,获取登录信息

技术分享图片
import requests
import re

#请求1:
r1=requests.get(https://github.com/login)
r1_cookie=r1.cookies.get_dict() #拿到初始cookie(未被授权)
authenticity_token=re.findall(rname="authenticity_token".*?value="(.*?)",r1.text)[0] #从页面中拿到CSRF TOKEN
print("authenticity_token",authenticity_token)
#第二次请求:带着初始cookie和TOKEN发送POST请求给登录页面,带上账号密码
data=
    commit:Sign in,
    utf8:?,
    authenticity_token:authenticity_token,
    login:[email protected],
    password:yuanchenqi0316


#请求2:
r2=requests.post(https://github.com/session,
             data=data,
             cookies=r1_cookie,
             # allow_redirects=False
             )
print(r2.status_code)      #200
print(r2.url)              #看到的是跳转后的页面:https://github.com/
print(r2.history)          #看到的是跳转前的response:[<Response [302]>]
print(r2.history[0].text)  #看到的是跳转前的response.text

with open("result.html","wb") as f:

    f.write(r2.content)
View Code

2、爬取豆瓣电影信息 

技术分享图片
import requests

import re
import json
import time
from concurrent.futures import ThreadPoolExecutor
pool=ThreadPoolExecutor(50)

def getPage(url):

    response=requests.get(url)
    return response.text

def parsePage(res):

    com=re.compile(<div class="item">.*?<div class="pic">.*?<em .*?>(?P<id>d+).*?<span class="title">(?P<title>.*?)</span>
                   .*?<span class="rating_num" .*?>(?P<rating_num>.*?)</span>.*?<span>(?P<comment_num>.*?)评价</span>,re.S)

    iter_result=com.finditer(res)

    return iter_result

def gen_movie_info(iter_result):
    for i in iter_result:
        yield 
            "id":i.group("id"),
            "title":i.group("title"),
            "rating_num":i.group("rating_num"),
            "comment_num":i.group("comment_num"),
        

def stored(gen):
        with open("move_info.txt","a",encoding="utf8") as f:
            for line in gen:
                data=json.dumps(line,ensure_ascii=False)
                f.write(data+"
")


def spider_movie_info(url):
    res=getPage(url)
    iter_result=parsePage(res)
    gen=gen_movie_info(iter_result)
    stored(gen)

def main(num):

    url=https://movie.douban.com/top250?start=%s&filter=%num
    pool.submit(spider_movie_info,url)
    #spider_movie_info(url)


if __name__ == __main__:
    before=time.time()
    count=0
    for i in range(10):
        main(count)
        count+=25
    after=time.time()

    print("总共耗费时间:",after-before)
View Code
 

网络爬虫之requests模块(代码片段)

一.requests模块的学习什么是requests模块? requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。为什么要使用requests模块因... 查看详情

爬虫之requests模块(代码片段)

.../www.cnblogs.com/peng104/p/9846613.html爬虫的基本流程简介简介:Requests是用python语言基于urllib编写的,采用的是Apache2Licensed开源协议的HTTP库,Requests它会比urllib更加方便,可以节约我们大量的工作。一句话,requests是python实现的最简单... 查看详情

爬虫之resquests模块的使用(代码片段)

 RequestsRequests模块Requests模块是一个用于网络访问的模块,其实类似的模块有很多,比如urllib,urllib2,httplib,httplib2,他们基本都提供相似的功能。在上一篇我们已经使用urllib模块而Requests会比urllib更加方便,可以节约我们大... 查看详情

爬虫之requests(代码片段)

requestsPython标准库中提供了:urllib、urllib2、httplib等模块以供Http请求,但是,它的API太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。Requests是使用Apache2Lice... 查看详情

爬虫基础之requests(代码片段)

requestsPython标准库中提供了:urllib、urllib2、httplib等模块以供Http请求,但是,它的API太渣了。它是为另一个时代、另一个互联网所创建的。它需要巨量的工作,甚至包括各种方法覆盖,来完成最简单的任务。Requests是使用Apache2Lice... 查看详情

爬虫系列之第1章-简介&requests模块(代码片段)

概述近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的利益,而网络爬虫是其中最为常用的一种从网上爬取数据的手段... 查看详情

python爬虫之reuqests库,及基本使用(代码片段)

一、Requests简介urllib库参考:Python爬虫之urllib库Requests是用python语言基于urllib编写的,该模块主要用来发送HTTP请求,requests模块比urllib模块更简洁,是学习python爬虫的较好的http请求模块。不是python的内置库,如... 查看详情

python爬虫之reuqests库,及基本使用(代码片段)

一、Requests简介urllib库参考:Python爬虫之urllib库Requests是用python语言基于urllib编写的,该模块主要用来发送HTTP请求,requests模块比urllib模块更简洁,是学习python爬虫的较好的http请求模块。不是python的内置库,如... 查看详情

python之爬虫urllib库的基本使用(代码片段)

官方文档地址:https://docs.python.org/3/library/urllib.html什么是UrllibUrllib是python内置的HTTP请求库包括以下模块urllib.request请求模块urllib.error异常处理模块urllib.parseurl解析模块urllib.robotparserrobots.txt解析模块urlopen关于urllib.request 查看详情

爬虫之request模块

爬虫之request模块request简介#介绍:使用requests可以模拟浏览器的请求,比起之前用到的urllib,requests模块的api更加便捷(本质就是封装了urllib3)#注意:requests库发送请求将网页内容下载下来以后,并不会执行js代码,这需要我们... 查看详情

爬虫基础之requests模块(代码片段)

...块或者库如浏览器一般向目标站点发送请求, 即一个request, 请求可以携带headers和参数等信息, 然后等待服务器响应获取响应: 服务器正常响应, 会返回一个response, 即页面内容, 类型可能是html, jso 查看详情

requests模块高级操作(代码片段)

...okie写入到headers中即可自动处理session对象。该对象可以像requests一样进行get和post请求的发送。唯一的不同之处在于,如果使用session进行请求发送的,如果在请求中产生了cookie,则cookie会被自动保存到该session对象中。在爬虫使用s... 查看详情

爬虫系列之第3章-selenium模块(代码片段)

...是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏... 查看详情

爬虫-requests模块(代码片段)

 引入Requests唯一的一个非转基因的PythonHTTP库,人类可以安全享用。警告:非专业使用其他HTTP库会导致危险的副作用,包括:安全缺陷症、冗余代码症、重新发明轮子症、啃文档症、抑郁、头疼、甚至死亡。今日概要基于reque... 查看详情

python爬虫_requests模块(代码片段)

什么是requests模块  requests模块是python中原生的基于网络请求的模块,其主要作用是用来模拟浏览器发起请求。功能强大,用法简洁高效。在爬虫领域中占据着半壁江山的地位。  优点:自动处理url编码    自动处理post请... 查看详情

爬虫进阶requests模块(万字长文)(代码片段)

requests模块requests模块1.requests模块介绍1.1requests模块的作用1.2requests模块是一个第三方模块,需要在你的python(虚拟)环境中额外安装1.3requests模块发送get请求2.response响应对象2.1response.text和response.content的区别:2.2通过对respons... 查看详情

python网络爬虫之requests模块

什么是requests模块:  requests模块是python中原生的基于网路请求的模块,其主要作用是用来模拟浏览器发送请求,功能强大,用法简洁高效,在爬虫的领域占半壁江山如何使用requests模块:  安装:pipinstallrequests  使用流程:    1... 查看详情

python爬虫之urllib库,及urllib库的4个模块基本使用和了解(代码片段)

...理。Python3的urllib。urllib包包含以下几个模块:urllib.request-打开和读取URL。urllib.error-包含urllib.request抛出的异常。urllib.parse-解析URL。urllib.robotparser 查看详情