这里简单介绍一下吧,以抓取网站静态、动态2种数据为例,实验环境win10+,主要内容如下:
抓取网站静态数据(数据在网页源码中):以糗事百科网站数据为例
1.这里假设我们抓取的数据如下,主要包括用户昵称、内容、好笑数和评论数这4个字段,如下:
对应的网页源码如下,包含我们所需要的数据:
2.对应网页结构,主要代码如下,很简单,主要用到requests+BeautifulSoup,其中requests用于请求页面,BeautifulSoup用于解析页面:
程序运行截图如下,已经成功爬取到数据:
抓取网站动态数据(数据不在网页源码中,json等文件中):以人人贷网站数据为例
1.这里假设我们爬取的是债券数据,主要包括年利率、借款标题、期限、金额和进度这5个字段信息,截图如下:
打开网页源码中,可以发现数据不在网页源码中,按F12抓包分析时,才发现在一个json文件中,如下:
2.获取到json文件的url后,我们就可以爬取对应数据了,这里使用的包与上面类似,因为是json文件,所以还用了json这个包(解析json),主要内容如下:
程序运行截图如下,已经成功抓取到数据:
至此,这里就介绍完了这2种数据的抓取,包括静态数据和动态数据。总的来说,这2个示例不难,都是入门级别的爬虫,网页结构也比较简单,最重要的还是要会进行抓包分析,对页面进行分析提取,后期熟悉后,可以借助scrapy这个框架进行数据的爬取,可以更方便一些,效率更高,当然,如果爬取的页面比较复杂,像验证码、加密等,这时候就需要认真分析了,网上也有一些教程可供参考,感兴趣的可以搜一下,希望以上分享的内容能对你有所帮助吧。
应用1:关键词自动生成
核心思想是对于某个文档中的某个词,计算其在这个文档中的标准化TF值,然后计算这个词在整个语料库中的标准化IDF值。在这里,标准化是说对原始的计算公式进行了一些变换以取得更好的衡量效果,并避免某些极端情况的出现。这个词的TF-IDF值便等于TF*IDF。对于这个文档中的所有词计算它们的TF-IDF值,并按照由高到低的顺序进行排序,由此我们便可以提取我们想要的数量的关键词。
TF-IDF的优点是快捷迅速,结果相对来说比较符合实际情况。缺点是当一篇文档中的两个词的IDF值相同的时候,出现次数少的那个词有可能更为重要。再者,TF-IDF算法无法体现我词的位置信息,出现位置靠前的词与出现位置靠后的词,都被视为重要性相同,这是不正确的。存在的解决办法是对文章的第一段和每段的第一句话给予比较大的权重。
应用2:计算文本相似度
明白了对于每个词,如何计算它的TF-IDF值。那么计算文本相似度也轻而易举。我们已经计算了文章中每个词的TF-IDF值,那么我们便可以将文章表征为词的TF-IDF数值向量。要计算两个文本的相似度,只需要计算余弦即可,余弦值越大,两个文本便越相似。
应用3:自动摘要
以第一个图为例,其中的cluster一共有7个词,其中4个是关键词。因此它的重要性分值就等于(4*4)/7=。然后,找出包含cluster重要性分值最高的句子(比如5句),把它们合在一起,就构成了这篇文章的自动摘要。具体实现可以参见
类似的算法已经被写成了工具,比如基于Java的Classifier4J库的SimpleSummariser模块、基于C语言的OTS库、以及基于classifier4J的C#实现和python实现。
别折腾了,不打算往爬虫方向发展的话没必要自己学,爬虫所需要的技术非常广泛、且对深度都有一定要求,不存在“快速学会”的情况。所有那些吹快速学会爬虫的培训班都是扯淡,那些课程学完后的水平连傻瓜式爬虫工具都不如,有啥意义?再说了,你们写论文、做研究又不会需要什么很大量、很高频、很实时的数据,那些傻瓜式爬虫工具完全足够了,点几下就能出数据。
方法/步骤
一、使用的技术栈:爬虫:python27 +requests+json+bs4+time分析工具: ELK套件开发工具:pycharm数据成果简单的可视化分析1.性别分布0 绿色代表的是男性 ^ . ^1 代表的是女性-1 性别不确定可见知乎的用户男性颇多。二、粉丝最多的top30粉丝最多的前三十名:依次是张佳玮、李开复、黄继新等等,去知乎上查这些人,也差不多这个排名,说明爬取的数据具有一定的说服力。三、写文章最多的top30四、爬虫架构爬虫架构图如下:说明:选择一个活跃的用户(比如李开复)的url作为入口url.并将已爬取的url存在set中。抓取内容,并解析该用户的关注的用户的列表url,添加这些url到另一个set中,并用已爬取的url作为过滤。解析该用户的个人信息,并存取到本地磁盘。logstash取实时的获取本地磁盘的用户数据,并给elsticsearchkibana和elasticsearch配合,将数据转换成用户友好的可视化图形。五、编码爬取一个url:解析内容:存本地文件:代码说明:* 需要修改获取requests请求头的authorization。* 需要修改你的文件存储路径。源码下载:点击这里,记得star哦!https : // github . com/forezp/ZhihuSpiderMan六、如何获取authorization打开chorme,打开https : // www. zhihu .com/,登陆,首页随便找个用户,进入他的个人主页,F12(或鼠标右键,点检查)七、可改进的地方可增加线程池,提高爬虫效率存储url的时候我才用的set(),并且采用缓存策略,最多只存2000个url,防止内存不够,其实可以存在redis中。存储爬取后的用户我说采取的是本地文件的方式,更好的方式应该是存在mongodb中。对爬取的用户应该有一个信息的过滤,比如用户的粉丝数需要大与100或者参与话题数大于10等才存储。防止抓取了过多的僵尸用户。八、关于ELK套件关于elk的套件安装就不讨论了,具体见官网就行了。网站:https : // www . elastic . co/另外logstash的配置文件如下:从爬取的用户数据可分析的地方很多,比如地域、学历、年龄等等,我就不一一列举了。另外,我觉得爬虫是一件非常有意思的事情,在这个内容消费升级的年代,如何在广阔的互联网的数据海洋中挖掘有价值的数据,是一件值得思考和需不断践行的事情。
唔可能是你没有登录成功啊
因为发现-知乎这个链接是不用登录就能抓的
但是这个知乎没有登录不行
看了下知乎登录不是这么简单的你没有登录成功
1 问题描述
起始页面 ython 包含许多指向其他词条的页面。通过页面之间的链接访问1000条百科词条。
对每个词条,获取其标题和简介。
2 讨论
首先获取页面源码,然后解析得到自己要的数据。
这里我们通过urllib或者requests库获取到页面源码,然后通过beautifulsoup解析。
可以看到,标题是在
标签下的。可以看出,简介是在class为lemma-summary的div下的。
可以看出,其他词条的格式都遵循hcom/item/xxx的形式
3 实现
# coding=utf-8from urllib import requestfrom bs4 import BeautifulSoupimport reimport tracebackimport timeurl_new = set()url_old = set()start_url = 'httpm/item/python'max_url = 1000def add_url(url):if len(url_new) + len(url_old) > 1000: returnif url not in url_old and url not in url_new:(url)def get_url():url = ()(url) return urldef parse_title_summary(page):soup = BeautifulSoup(page, '')node = ('h1')title = = ('div', class_='lemma-summary')summary = return title, summarydef parse_url(page):soup = BeautifulSoup(page, '')links = ('a', href=(r'/item/'))res = set()baikeprefix = ''for i in links:(baikeprefix + i['href']) return resdef write2log(text, name='d:/'):with open(name, 'a+', encoding='utf-8') as fp:('\n')(text)if __name__ == '__main__':(start_url) print('working')time_begin=()count = 1while url_new:url = get_url() try:resp = (url)text = ().decode()write2log('.'.join(parse_title_summary(text)))urls = parse_url(text) for i in urls:add_url(i) print(str(count), 'ok')count += 1except:() print(url)time_end=() print('time elapsed: ', time_end - time_begin) print('the end.')
输出结果
working1 ok略983 ok984 oktime elapsed: end.
将urllib替换为第三方库requests:
pip install requests
略if __name__ == '__main__':(start_url) print('working')time_begin = ()count = 1while url_new:url = get_url() try: with () as s:resp = (url)text = () # 默认'utf-8'write2log('.'.join(parse_title_summary(text)))urls = parse_url(text) for i in urls:add_url(i) print(str(count), 'ok')count += 1except:() print(url)time_end = () print('time elapsed: ', time_end - time_begin) print('the end.')
输出
略986 ok987 ok988 ok989 oktime elapsed: end.
一个通用的爬虫架构包括如下四部分:
#!/usr/bin/env python # -*- coding: utf-8 -*- # @Author: Administrator # @Date: 2015-10-31 15:45:27 # @Last Modified by: Administrator # @Last Modified time: 2015-11-23 16:57:31 import requests import sys import json import re reload(sys) ('utf-8') #获取到匹配字符的字符串 def find(pattern,test): finder = (pattern, test) start = () end = () return test[start:end-1] cookies = { '_ga':'', '_za':'8d570b05-b0b1-4c96-a441-faddff34', 'q_c1':'23ddd234234', '_xsrf':'234id':'"ZTE3NWY2ZTsdfsdfsdfWM2YzYxZmE=|1446435757|15fef3b84e044c122ee0fe8959e606827d333134"', 'z_c0':'"QUFBQXhWNGZsdfsdRvWGxaeVRDMDRRVDJmSzJFN1JLVUJUT1VYaEtZYS13PT0=|14464e234767|57db366f67cc107a05f1dc8237af24b865573cbe5"', '__utmt':'1', '__utma':'', '__utmb':'', '__utmc':'51123390', '__utmz':'|utmcgcn=(referral)|utmcmd=referral|utmcct=/', '__utmv':'|2=registration_date=2028=1^3=entry_date=201330318=1'} headers = {'user-agent': 'Mozilla/ (Windows NT ; WOW64) AppleWebKit/ (KHTML, like Gecko) Chrome/ Safari/', 'referer':'', 'host':'','Origin':'', 'Content-Type':'application/x-www-form-urlencoded; charset=UTF-8', 'Connection':'keep-alive','X-Requested-With':'XMLHttpRequest','Content-Length':'81', 'Accept-Encoding':'gzip,deflate','Accept-Language':'zh-CN,zh;q=','Connection':'keep-alive' } #多次访问之后,其实一加载时加载20个问题,具体参数传输就是offset,以20递增 dicc = {"offset":60} n=20 b=0 # 与爬取图片相同的是,往下拉的时候也会发送http请求返回json数据,但是不同的是,像模拟登录首页不同的是除了 # 发送form表单的那些东西后,知乎是拒绝了我的请求了,刚开始以为是headers上的拦截,往headers添加浏览器 # 访问是的headers那些信息添加上,发现还是拒绝访问。 #想了一下,应该是cookie原因。这个加载的请求和模拟登录首页不同 #所以补上其他的cookies信息,再次请求,请求成功。 for x in xrange(20,460,20): n = n+20 b = b+20 dicc['offset'] = x formdata = {'method':'next','params':'{"offset":20}','_xsrf':'20770d88051f0f45e941570645f5e2e6'} #传输需要json串,和python的字典是有区别的,需要转换 formdata['params'] = (dicc) # print (dicc) # print dicc circle = ("", cookies=cookies,data=formdata,headers=headers) #response内容 其实爬过一次之后就大同小异了。 都是 #问题返回的json串格式 # {"r":0, # "msg": ["