为了做到更优雅,这次抛弃了urllib库的引用,使用requests和beautifulsoup搭配的方式进行 首先构建一个请求并且响应它然后呢到上找一篇文章试试手,看一下网页源码找到文章的div以及找到文章内容,仔细看看内容还挺不错哈哈可以发现所有的内容都在p标签里面,那么接下来就简单多了只需要f5运行一下 最后使用codecs库来进行文件操作将文章保存到本地没错使用上requests和bs4之后爬取文章的工作是那么的轻松呢效果图
可以先利用搜索引擎学习。简单爬虫不难,无非发起http访问,取得网页的源代码文本,从源代码文本中抽取信息。首先要自己会写代码。学习爬虫可以从下面一些知识点入手学习。1、http相关知识。2、浏览器拦截、抓包。3、python2 中编码知识,python3 中bytes 和str类型转换。4、抓取javascript 动态生成的内容。5、模拟post、get,header等6、cookie处理,登录。7、代理访问。8、多线程访问、python 3 asyncio 异步。9、正则表达式、xpath等。。。。10、scrapy requests等第三方库的使用。
别折腾了,不打算往爬虫方向发展的话没必要自己学,爬虫所需要的技术非常广泛、且对深度都有一定要求,不存在“快速学会”的情况。所有那些吹快速学会爬虫的培训班都是扯淡,那些课程学完后的水平连傻瓜式爬虫工具都不如,有啥意义?再说了,你们写论文、做研究又不会需要什么很大量、很高频、很实时的数据,那些傻瓜式爬虫工具完全足够了,点几下就能出数据。
方法/步骤
主要是两点或者三点第一个是爬虫的技术框架,这个比较好,理解了第二个是医疗数据内容以及可视化选择,就比如说医疗数据,你是用饼图还是柱状图去反映一些病情然后写一些代码实践上的技术考量,以及运行结果这就是核心了,然后照着论文框架套一下就可以了
可以先利用搜索引擎学习。简单爬虫不难,无非发起http访问,取得网页的源代码文本,从源代码文本中抽取信息。首先要自己会写代码。学习爬虫可以从下面一些知识点入手学习。1、http相关知识。2、浏览器拦截、抓包。3、python2 中编码知识,python3 中bytes 和str类型转换。4、抓取javascript 动态生成的内容。5、模拟post、get,header等6、cookie处理,登录。7、代理访问。8、多线程访问、python 3 asyncio 异步。9、正则表达式、xpath等。。。。10、scrapy requests等第三方库的使用。
做爬虫,特别是python写说容易挺容易,说难也挺难的,举个栗子 简单的:将上面的所有代码爬下来写个for循环,调用urllib2的几个函数就成了,基本10行到20行以内的代码难度0情景:1.网站服务器很卡,有些页面打不开,urlopen直接就无限卡死在了某些页面上(以后urlopen有了timeout)2.爬下来的网站出现乱码,你得分析网页的编码3.网页用了gzip压缩,你是要在header里面约定好默认不压缩还是页面下载完毕后自己解压4.你的爬虫太快了,被服务器要求停下来喝口茶5.服务器不喜欢被爬虫爬,会对对header头部浏览器信息进行分析,如何伪造6.爬虫整体的设计,用bfs爬还是dfs爬7.如何用有效的数据结构储存url使得爬过的页面不被重复爬到8.比如1024之类的网站(逃,你得登录后才能爬到它的内容,如何获取cookies以上问题都是写爬虫很常见的,由于python强大的库,略微加了一些代码而已难度1情景:1.还是cookies问题,网站肯定会有一个地方是log out,爬虫爬的过程中怎样避免爬到各种Log out导致session失效2.如果有验证码才能爬到的地方,如何绕开或者识别验证码3.嫌速度太慢,开50个线程一起爬网站数据难度2情景:1.对于复杂的页面,如何有效的提取它的链接,需要对正则表达式非常熟练2.有些标签是用Js动态生成的,js本身可以是加密的,甚至奇葩一点是jsfuck,如何爬到这些难度3总之爬虫最重要的还是模拟浏览器的行为,具体程序有多复杂,由你想实现的功能和被爬的网站本身所决定爬虫写得不多,暂时能想到的就这么多,欢迎补充
一、使用的技术栈:爬虫: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": ["