涉及知识点
1、抓取数据
2、分页爬虫
规律分析
1、抓取数据,发现每一项都是data-tools标签
2、分页分析
代码
import requests from bs4 import BeautifulSoup import re import json import jieba #获取html页面信息 def getKeywordResult(keyword, pagenum): url = 'http://www.baidu.com/s?wd=' + keyword + '&pn=' + pagenum + '0' try: r = requests.get(url, timeout=30) r.raise_for_status() r.encoding = 'utf-8' return r.text except: return "" #解析并抽取数据 def parserLinks(html): soup = BeautifulSoup(html, "html.parser") links = [] for div in soup.find_all('div', {'data-tools':re.compile('title')}): data = div.attrs['data-tools'] d = json.loads(data) links.append(d['title']) words_all.append(d['title']) return links, words_all #词频统计 def words_ratio(words_all): words = [] for i in words_all: tmp = jieba.lcut(i) for tmp_word in tmp: words.append(tmp_word) counts = {} for word in words: if len(word) == 1: continue else: counts[word] = counts.get(word, 0) + 1 items = list(counts.items()) items.sort(key=lambda x: x[1], reverse=True) for i in range(30): word, count = items[i] print("{0:<10}{1:>5} 占比:{2}".format(word, count, int(count)/len(words))) def main(): for pagenum in range(0, 50): html = getKeywordResult('老张', str(pagenum))#输入搜索关键词和页数 ls, words_all = parserLinks(html) count = pagenum + 1 for i in ls: print("[{:^3}]{}".format(count, i)) ls = [] words_ratio(words_all) if __name__ == '__main__': words_all = [] main()
结果
后续的思考
代码都很简单,高手要懂得如何去扩展。现在虽然数据都爬下来了,但是非常凌乱,仍然需要人工去分析比对。这样的数据我称之为裸数据,理想的数据是可读且有关联的,我称之为金子数据。
这个转换分析的过程涉及到两个问题:
1、如何实现可读?
可以用字典里面的del[]方法删去坏的数据
2、如何实现数据的关联性?
先将裸数据进行二次分析,将相关的字项放到一块,然后再做运行