Python爬虫快速入门中南大学商学院邓旭东自我介绍2009-2013哈尔滨工业大学经济管理学院2015-至今中南大学商学院主要研究方向为线上社群及消费者行为,在学习研究过程中,习得了数据科学相关技术,如数据采集、数据清理、数据规整、统计分析熟悉R、python、MongoDB。目录二、准备知识一、引言三、网页请求四、网页解析五、开始采集六、如何应对反爬七、高级爬虫•爬虫工作原理•HTML+CSS•Python基本知识•找规律构建url•requests库•如何解析网页•BeautifulSoup•re库的使用•条件、循环语句•try。。。Except异常处理。•数据存储•控制访问频率•伪装装成浏览器•使用代理IP•selenium+Firefox(36版)•抓包应对动态网页引言爬虫能做什么?微博最近有啥热门话题淘宝京东上某商品价格变动邮箱通知女/男神最新动态谁点赞最活跃BBS抢沙发社交网络分析….引言爬虫能做什么一句话,只要浏览器有的,你都可以抓可以爬引言爬虫好学吗?frommathimportpowYouJoinUs={‘is’:True}IfYouJoinUs[‘is’]:result=pow(1.01,365)print(result)37.7834简单的道理目录一、引言三、网页请求四、网页解析五、开始采集六、如何应对反爬七、高级爬虫•爬虫工作原理•HTML•Python基本知识•找规律构建url•requests库•如何解析网页•BeautifulSoup•re库的使用•条件、循环语句•try。。。Except异常处理。•数据存储•控制访问频率•伪装装成浏览器•使用代理IP•selenium+Firefox(36版)•抓包应对动态网页二、准备知识爬虫工作原理•蓝色线条:发起请求(request)•红色线条:返回响应(response)HTML标签访问Python中文社区返回HTML文件如下:浏览器显示效果Python基本知识基本数据类型(str,list,tuple,set,dict)循环语句(for循环)条件语句(ifelsewhile)表达式(如age=20)字符串str字符串:单(双、三)引号及其夹住的字符String=‘我叫邓旭东’String[2:5]邓旭东列表list[1,2,3,4,5][‘1’,’2’,’3’,’4’,’5’][‘a’,’b’,’c’,’d’][(1,2),(1,2)]…列表中的元素可以是字符串,数字,元组,字典,集合下面的写法是不对的[a,b,c](除非a,b,c是变量)元组tuple(1,2,3,4)(’1’,‘2’,‘3’,‘4’)(‘a’,’b’,’c’,’d’)集合set{‘a’,’b’,’c’}集合是不重复的元素组成的一个基本数据类型。字典dictDict={‘name’:‘邓旭东’,‘age’:26,‘gender’:‘male’}在大括号中,数据成对存储,冒号左边是键(key),冒号右边是值(value)Dict[‘age’]26for循环forxin[‘1’,’2’,’3’]:print(x)123目录一、引言三、网页请求四、网页解析五、开始采集六、如何应对反爬七、高级爬虫•爬虫工作原理•HTML•Python基本知识•找规律构建url•requests库•如何解析网页•BeautifulSoup•re库的使用•条件、循环语句•try。。。Except异常处理。•数据存储•控制访问频率•伪装装成浏览器•使用代理IP•selenium+Firefox(36版)•抓包应对动态网页二、准备知识找规律构建url通过点击翻看同一个目录下的多个页面,发现规律,定制url发现规律定制url发现规律定制url这里的url规律是页码数减1后乘以20构建网址Base_url=‘={num}’forpageinrange(1,94,1):Num=page-1url=Base_url.format(num=Num*20)print(url)‘=0’‘=20’‘=40’……requests库RequestsisanelegantandsimpleHTTPlibraryforPython,builtforhumanbeings.Requests是一个优雅简洁的PythonHTTP库,给人类使用。requests常用方法最普通的访问url=‘’r=requests.get(url)伪装成浏览器的访问Headers={‘User-Agent’:’Mozilla/5.0(Macintosh;IntelMacOSX10_12_3)AppleWebKit/537.36(KHTML,likeGecko)Chrome/56.0.2924.87Safari/537.36’}r=requests.get(url,headers=Headers)requests常用方法使用cookie访问Cookie={‘Cookie’:’UM_distinctid=15ab64ecfd6592-0afad5b368bd69-1d3b6853-13c680-15ab64ecfd7b6;remember_user_token=W1sxMjEzMTM3XSwiJDJhJDEwJHhjYklYOGl2eTQ0Yi54WC5seVh2UWUiLCIxNDg5ODI2OTgwLjg4ODQyODciXQ%3D%3D---ac835770a030c0595b2993289e39c37d82ea27e2;CNZZDATA1258679142=559069578-1488626597-https%253A%252F%252F’}r=requests.get(url,cookies=cookies)requests常用方法r.textu‘[{“repository”:{“open_issues”:0,“url”:“返回请求的状态r.status_code#(4开头客户端问题,5开头服务器问题)200目录一、引言三、网页请求四、网页解析五、开始采集六、如何应对反爬七、高级爬虫•爬虫工作原理•HTML•Python基本知识•找规律构建url•requests库•如何解析网页•BeautifulSoup•re库的使用•条件、循环语句•try。。。Except异常处理。•数据存储•控制访问频率•伪装装成浏览器•使用代理IP•selenium+Firefox(36版)•抓包应对动态网页二、准备知识如何解析网页1.火狐Firebug/谷歌的开发者工具2.BeaufifulSoup/re库Python基本知识BeautifulSoupbsObj=BeautifulSoup(html,“html.parser”)格式化输出bsObj对象的内容4567891011html=htmlheadtitleTheDormouse'sstory/title/headbodypclass=titlename=dromousebTheDormouse'sstory/b/ppclass=storyOnceuponatimetherewerethreelittlesisters;andtheirnameswereahref==sisterid=link1!--Elsie--/a,ahref==sisterid=link2Lacie/aandahref==sisterid=link3Tillie/a;andtheylivedatthebottomofawell./ppclass=story.../p两种主要的对象:Tag、NavigableStringtag对象bsObj.title‘titleTheDormouse‘sstory/title’bsObj.head‘headtitleTheDormouse‘sstory/title/head’bsObj.a‘aclass=sisterhref==link1!--Elsie--/a’注意:它查找的是在所有内容中的第一个符合要求的标签,如果要查询所有的标签,这种方法不奏效BeautifulSoup–遍历文档树#直接子节点.contentsbsObj.head.contents#输出的为列表[‘titleTheDormouse‘sstory/title’]bsObj.head.contents[0]从列表中取出子节点‘titleTheDormouse'sstory/title’BeautifulSoup–遍历文档树#直接子节点.childrenbsObj.head.children#返回生成器,可以迭代取出来listiteratorobjectat0x7f71457f5710forchildinsoup.body.children:printchild‘pclass=“title”name=“dromouse”bTheDormouse‘sstory/b/p’‘pclass=“story”Onceuponatimetherewerethreelittlesisters;andtheirnameswere’‘aclass=“sister”href=“”id=“link1”!--Elsie--/a’‘aclass=“sister”href=“”id=“link2”Lacie/aand’‘aclass=“sister”href=“”id=“link3”Tillie/a’‘andtheylivedatthebottomofawell./ppclass=story.../p’Tag对象#Attrspclass=titlename=dromousebTheDormouse'sstory/b/pbsObj.p.attrs{‘class’:‘title’,‘name’:‘dromouse’}bsObj.p.attrs[‘class’]‘title’bsObi.p.attrs.get(‘class’)'title’NavigableString对象#获取标签内部的文字bsObj.p.stringTheDormouse'sstoryfind/find_allfind_all(name,attrs)得到的所有符合条件的结果,返回的是列表格式bsObj.findall(‘a’)[aclass=“sister”href=“”id=“link1”