如何采集网站数据(如何快速抓取网页上的数据)
【资料图】
不管是数据分析,还是数据建模乃至数据挖掘,在进行这些高大上的工作之前我们都要进行数据采集,数据是数据工作的基础,没有数据,挖掘也没有意义。俗话说,巧妇难为无米之炊,所以,接下来我们来聊下爬虫。
爬虫是采集外部数据的重要的方式。常用于竞对分析,也有将爬虫应用成自身的业务,如搜索引擎就是爬虫最高的应用。当然,爬虫也不是可以肆无忌惮的,一不小心可能就变成面向监狱式编程了。
爬虫抓取,一般是针对特定的网站或App,通过爬虫脚本或程序对指定的页面进行数据采集。是指通过编程向网络服务器请求数据(HTML表单),然后解析HTML,提取出自己想要的数据。
一般而言,爬虫需要掌握一门编程语言,要了解HTML、网络服务器、数据库等知识,建议从python入门,能快速上手爬虫,并且有很多第三方的类库,能快速方便地进行网页爬虫。
1、先进行网页解析
按一下F12,即可调出网页调试界面,可以看到Element 标签下对应的 HTML代码,这些其实就是网页的代码,网页都是通过解析hmtl等源码,通过加载、渲染展示成大家看到的样子,就像穿了衣服化妆打扮的你(手动滑稽)。
我们可以进行网页元素的定位,左上角有个小按钮,点一下它然后在网页上找到你想定位的地方,就可以直接定位到此处的源码,如下图所示:
我们可以修改下源码看看,将定位到的源码处【python】改成【我是帅哥】,哎嘿,网页上就会发生不一样的变化。以上主要做科普作用,这块主要还是前端工程师的领域,所有大家看到的地方都是前端地辛苦付出,冰山下的都是后端工程师的地盘。
有点跑题了,回归正题,网页解析到了,可以定位到想要爬去的元素内容了,接下来就是调包写爬虫脚本,基本网页上能看到的都可以爬取,所见即所得。
2、程序如何访问网页
可以点击Network按钮,查看我们在浏览器搜索输入框输入一个关键词:python都经历了什么。涉及的专业内容可能过于复杂,大家感觉到的可能就是我输入了一个关键词,网页给我返回很多内容,其实中间是本地客户端发送一个get请求到服务器端,服务器端通过解析内容,中间经过TCP的三次握手,四次挥手,网络安全、加密等,最后安全地把内容返回到你本地的客户端上,是不是感觉头都开始有点大了,为了我们能快乐地在网络上冲浪,工程师们真的不容易~~
了解了这些内容,有助于帮助我们理解爬虫的机制。简单来说,就是一段程序,模拟人去登录网页,进行请求访问,找到返回的网页内容并把数据下载下来。刚才说到网页network的内容,常见的请求有get、post两种,GET请求把请求参数都暴露在URL上,而POST请求的参数放在request body 里面,POST请求方式还对密码参数加了密,这样就相对安全一些。
程序要模拟请求头(Request Header)进行访问,我们在做http请求的时候除了提交一些参数之外,还定义一些请求的头部信息,比如Accept、Host、cookie、User-Agent等等,主要就是将爬虫程序伪装成正规请求,获取情报内容。
爬虫就有点像间谍,打入地方内部,套取出我方想要的情报,此处不明觉厉,skr~~~
3、请求返回的接收信息
r=requests.get('https://httpbin.org/get')r.status_code//返回200r.headers{'content-encoding':'gzip','transfer-encoding':'chunked','connection':'close','server':'nginx/1.0.4','x-runtime':'148ms','etag':'"e1ca502697e5c9317743dc078f67693f"','content-type':'application/json'}importrequestsr=requests.get('https://api.github.com/events')r.json()//以上操作可以算是最基本的爬虫了,返回内容如下:[{u'repository':{u'open_issues':0,u'url':'https://github.com/...
通过解析返回的json字符串就可以获取到想要的数据了,恭喜~
接下来,我们来个豆瓣电影排名的爬虫实战:
#!/usr/bin/envpython3#-*-coding:utf-8-*-"""CreatedonWedJul3115:52:532019@author:kaluosi"""importrequestsimportreimportcodecsfrombs4importBeautifulSoupfromopenpyxlimportWorkbookimportpandasaspdwb=Workbook()dest_filename='电影.xlsx'ws1=wb.activews1.title="电影top250"DOWNLOAD_URL='http://movie.douban.com/top250/'defdownload_page(url):"""获取url地址页面内容"""headers={'User-Agent':'Mozilla/5.0(Macintosh;IntelMacOSX10_11_2)AppleWebKit/537.36(KHTML,likeGecko)Chrome/47.0.2526.80Safari/537.36'}data=requests.get(url,headers=headers).contentreturndatadefget_li(doc):soup=BeautifulSoup(doc,'html.parser')ol=soup.find('ol',class_='grid_view')name=[]#名字star_con=[]#评价人数score=[]#评分info_list=[]#短评foriinol.find_all('li'):detail=i.find('div',attrs={'class':'hd'})movie_name=detail.find('span',attrs={'class':'title'}).get_text()#电影名字level_star=i.find('span',attrs={'class':'rating_num'}).get_text()#评分star=i.find('div',attrs={'class':'star'})star_num=star.find(text=re.compile('评价'))#评价info=i.find('span',attrs={'class':'inq'})#短评ifinfo:#判断是否有短评info_list.append(info.get_text())else:info_list.append('无')score.append(level_star)name.append(movie_name)star_con.append(star_num)page=soup.find('span',attrs={'class':'next'}).find('a')#获取下一页ifpage:returnname,star_con,score,info_list,DOWNLOAD_URL+page['href']returnname,star_con,score,info_list,Nonedefmain():url=DOWNLOAD_URLname=[]star_con=[]score=[]info=[]whileurl:doc=download_page(url)movie,star,level_num,info_list,url=get_li(doc)name=name+moviestar_con=star_con+starscore=score+level_numinfo=info+info_list#pandas处理数据c={'电影名称':name,'评论人数':star_con,'电影评分':score,'评论':info}data=pd.DataFrame(c)data.to_excel('豆瓣影评.xlsx')if__name__=='__main__':main()
最后说一句,本次文章的爬虫仅限于交流学习使用。
关键词: