关键词:
概述
近年来,随着网络应用的逐渐扩展和深入,如何高效的获取网上数据成为了无数公司和个人的追求,在大数据时代,谁掌握了更多的数据,谁就可以获得更高的利益,而网络爬虫是其中最为常用的一种从网上爬取数据的手段。
网络爬虫,即Web Spider,是一个很形象的名字。如果把互联网比喻成一个蜘蛛网,那么Spider就是在网上爬来爬去的蜘蛛。网络蜘蛛是通过网页的链接地址来寻找网页的。从网站某一个页面(通常是首页)开始,读取网页的内容,找到在网页中的其它链接地址,然后通过这些链接地址寻找下一个网页,这样一直循环下去,直到把这个网站所有的网页都抓取完为止。如果把整个互联网当成一个网站,那么网络蜘蛛就可以用这个原理把互联网上所有的网页都抓取下来。
爬虫的价值
互联网中最有价值的便是数据,比如天猫商城的商品信息,链家网的租房信息,雪球网的证券投资信息等等,这些数据都代表了各个行业的真金白银,可以说,谁掌握了行业内的第一手数据,谁就成了整个行业的主宰,如果把整个互联网的数据比喻为一座宝藏,那我们的爬虫课程就是来教大家如何来高效地挖掘这些宝藏,掌握了爬虫技能, 你就成了所有互联网信息公司幕后的老板,换言之,它们都在免费为你提供有价值的数据。
爬虫的基本流程
预备知识:http协议
requests模块
基本语法
requests模块支持的请求:
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 基本请求
import requests response=requests.get(‘https://www.jd.com/‘,) with open("jd.html","wb") as f: f.write(response.content)
2 含参数请求
import requests response=requests.get(‘https://s.taobao.com/search?q=手机‘) response=requests.get(‘https://s.taobao.com/search‘,params="q":"美女")
3 含请求头请求
示例1: user-agent的使用,headers()
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‘, )
示例2:
import requests res=requests.post(‘https://www.lagou.com/jobs/positionAjax.json‘, headers= ‘Referer‘:"https://www.lagou.com/jobs/list_python", ‘User-Agent‘: ‘Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/63.0.3239.132 Safari/537.36‘, , data= ‘first‘:True, ‘pn‘:2, ‘kd‘:‘java高级开发‘ , params= ‘gj‘: ‘3年及以下‘, ‘px‘: ‘default‘, ‘yx‘: ‘25k-50k‘, ‘city‘: ‘北京‘, ‘needAddtionalResult‘: False, ‘isSchoolJob‘: 0 ) comapines_list=r6.json() print(comapines_list)
4 含cookies请求:
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()
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参数,用来存放请求体数据
response=requests.post("http://httpbin.org/post",params="a":"10", data="name":"yuan")
2 发送json数据
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) 常见属性
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) 编码问题
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) 下载二进制文件(图片,视频,音频)
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数据
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
对象的列表,为了完成请求而创建了这些对象。这个对象列表按照从最老到最近的请求进行排序。
>>> r = requests.get(‘http://github.com‘)
>>> r.url
‘https://github.com/‘
>>> r.status_code
>>> r.history
[<Response [301]>]
另外,还可以通过 allow_redirects
参数禁用重定向处理:
>>> 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(r‘name="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)
2、爬取豆瓣电影信息
import requests import re def get_html(url): """ 请求数据资源 :param url: :return: """ response = requests.get(url) return response.text def parser_html(res_html): """ 爬取数据,并解析 :param data: :return: """ ret = re.findall( ‘<div class="item">.*?<a href="(.*?)">.*?<span class="rating_num".*?>(.*?)</span>‘, res_html, re.S ) return ret def store(data): """ 持久化 :param data: :return: """ with open("douban.txt", "a", encoding="utf8") as f: for item in data: s = " ".join(list(item)) line = s + " " print(line) f.write(line) if __name__ == ‘__main__‘: index = 0 for i in range(10): url = "https://movie.douban.com/top250?start=%s&filter=" % index # 爬去资源 res_html = get_html(url) # 解析资源 data = parser_html(res_html) # 持久化 store(data) index += 25
3、爬取拉钩
import requests session = requests.session() session.get("https://www.lagou.com/") session.get("https://www.lagou.com/jobs/list_python") res = session.post( "https://www.lagou.com/jobs/positionAjax.json?px=default&city=%E5%8C%97%E4%BA%AC&needAddtionalResult=false", headers= "Referer": "https://www.lagou.com/jobs/list_python?labelWords=&fromSearch=true&suginput=", "X-Anit-Forge-Code": "0", "X-Anit-Forge-Token": None, "X-Requested-With": "XMLHttpRequest", "User-Agent": "Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36" , data= "first": "true", "pn": 1, "kd": "python", ) print(res.text)
爬虫系列之第3章-selenium模块(代码片段)
...是一个自动化测试工具,而爬虫中使用它主要是为了解决requests无法直接执行JavaScript代码的问题selenium本质是通过驱动浏览器,完全模拟浏览器的操作,比如跳转、输入、点击、下拉等,来拿到网页渲染之后的结果,可支持多种浏... 查看详情
爬虫系列之第2章-bs&xpath模块(代码片段)
一、BeautifulSoup BeautifulSoup简介简单来说,BeautifulSoup是python的一个库,最主要的功能是从网页抓取数据。官方解释如下:BeautifulSoup提供一些简单的、python式的函数用来处理导航、搜索、修改分析树等功能。它是一个工具箱,... 查看详情
[python系列-19]:爬虫-urllib.request.urlopen()和urllib.request.get()的使用区别
作者主页(文火冰糖的硅基工坊):https://blog.csdn.net/HiWangWenBing本文网址:https://blog.csdn.net/HiWangWenBing/article/details/119799336目录第1章urllib.request.urlopen1.1功能描述1.2函数原型第2章urllib.request.requests.g 查看详情
韦东山freertos系列教程之第十三章调试方法(代码片段)
文章目录系列教程总目录第十三章调试方法需要获取更好阅读体验的同学,请访问我专门设立的站点查看,地址:http://rtos.100ask.net/系列教程总目录本教程连载中,篇章会比较多,为方便同学们阅读,点击... 查看详情
韦东山freertos系列教程之第五章队列(queue)(代码片段)
文章目录系列教程总目录概述5.1队列的特性5.1.1常规操作5.1.2传输数据的两种方法5.1.3队列的阻塞访问5.2队列函数5.2.1创建5.2.2复位5.2.3删除5.2.4写队列5.2.5读队列5.2.6查询5.2.7覆盖/偷看5.3示例8:队列的基本使用5.4示例9:分辨数据源5.5... 查看详情
韦东山freertos系列教程之第六章队列(queue)(代码片段)
文章目录系列教程总目录概述6.1信号量的特性6.1.1信号量的常规操作6.1.2信号量跟队列的对比6.1.3两种信号量的对比6.2信号量函数6.2.1创建6.2.2删除6.2.3give/take6.3示例12:使用二进制信号量来同步6.4示例13:防止数据丢失6.5示例14:使用计... 查看详情
韦东山freertos系列教程之第九章任务通知(tasknotifications)(代码片段)
文章目录系列教程总目录概述9.1任务通知的特性9.1.1优势及限制9.1.2通知状态和通知值9.2任务通知的使用9.2.1两类函数9.2.2xTaskNotifyGive/ulTaskNotifyTake9.2.3xTaskNotify/xTaskNotifyWait9.3示例22:传输计数值9.4示例23:传输任意值需要获取更好阅读... 查看详情
1爬虫简介与request模块
...提供有价值的数据。爬虫的基本流程预备知识http协议二requests模块 查看详情
python爬虫之scrapy框架系列(16)——深入剖析request和response类(代码片段)
目录:Request和Response类:1.深入剖析Request类:利用request.meta传递参数拓展一:FormRequest类2.深入剖析Response类:Request和Response类:1.深入剖析Request类:importscrapyfromscrapy.httpimportRequest#Scrapy.http.Request类是scrapy框架中request的基类。#####... 查看详情
python爬虫之scrapy框架系列(16)——深入剖析request和response类(代码片段)
目录:Request和Response类:1.深入剖析Request类:利用request.meta传递参数拓展一:FormRequest类2.深入剖析Response类:Request和Response类:1.深入剖析Request类:importscrapyfromscrapy.httpimportRequest#Scrapy.http.Request类是scrapy框架中request的基类。#####... 查看详情
韦东山freertos系列教程之第十一章中断管理(interruptmanagement)(代码片段)
文章目录系列教程总目录概述11.1两套API函数11.1.1为什么需要两套API11.1.2两套API函数列表11.1.3xHigherPriorityTaskWoken参数11.1.4怎么切换任务11.2中断的延迟处理11.3中断与任务间的通信需要获取更好阅读体验的同学,请访问我专门设... 查看详情
differentialgeometry之第六章平面曲线的整体性质
第六章、平面曲线的整体性质1.平面的闭曲线1.1.切线的旋转指数定理1.2.等周不等式与圆的几何特性 ,其中 2.平面的凸曲线支撑函数: 2.1.Minkowski问题2.2.四顶点定理 查看详情
韦东山freertos系列教程之第八章事件组(eventgroup)(代码片段)
文章目录系列教程总目录概述8.1事件组概念与操作8.1.1事件组的概念8.1.2事件组的操作8.2事件组函数8.2.1创建8.2.2删除8.2.3设置事件8.2.4等待事件8.2.5同步点8.3示例20:等待多个事件8.3示例21:任务同步需要获取更好阅读体验的同学,... 查看详情
爬虫简介和requests模块(代码片段)
目录爬虫介绍requests模块requests模块1、requests模块的基本使用2、get请求携带参数,调用params参数,其本质上还是调用urlencode3、携带headers,请求头是将自身伪装成浏览器的关键4、带cookie5、发送post请求(注册,登陆),携带数据(bod... 查看详情
python爬虫之scrapy框架系列——xxtop250电影简介信息的获取及存储到本地
...应的简介信息:First:包含电影简介信息url的获取Second:爬虫文件的更改Third:编写get_detail()函数注意:特例的处理1.2第二步:把每个电影的简介信息存储到对应的电影信息里:①按习惯性的思路:步骤如下②习惯性思维不行... 查看详情
韦东山freertos系列教程之第十二章资源管理(resourcemanagement)(代码片段)
文章目录系列教程总目录概述12.1屏蔽中断12.1.1在任务中屏蔽中断12.1.2在ISR中屏蔽中断12.2暂停调度器需要获取更好阅读体验的同学,请访问我专门设立的站点查看,地址:http://rtos.100ask.net/系列教程总目录本教程连载... 查看详情
第一章网络爬虫简介(代码片段)
本章将介绍如下主题:网络爬虫领域介绍爬虫的合法与非法性对目标网站进行背景调研逐步完善一个高级网络爬虫1.1网络爬虫的使用场景 网络爬虫(又被称为网页蜘蛛,网络机器人,在FOAF社区中间,更经常的... 查看详情
differentialgeometry之第一章欧式空间
书籍:《微分几何》彭家贵局部微分几何第一章、欧式空间1.1向量空间(1)向量空间a.向量空间是集合,集合中的元素需要定义加法和乘法运算。向量空间和n维数组空间R^n不是同一个概念。b.欧式向量空间是向量空间的子集,满... 查看详情