初步接触python爬虫(其实python也是才起步),发现一段代码研究了一下,觉得还比较有用处,Mark下。
上代码:
#!/usr/bin/python#coding=utf-8#Author: Andrew_liu#mender:cy"""
一个简单的Python爬虫, 用于抓取豆瓣电影Top前100的电影的名称
Anthor: Andrew_liu
mender:cy
Version: 0.0.2
Date: 2017-03-02
Language: Python2.7.12
Editor: JetBrains PyCharm 4.5.4
"""import stringimport reimport urllib2import timeclass DouBanSpider(object) :
"""类的简要说明
主要用于抓取豆瓣Top100的电影名称
Attributes:
page: 用于表示当前所处的抓取页面
cur_url: 用于表示当前争取抓取页面的url
datas: 存储处理好的抓取到的电影名称
_top_num: 用于记录当前的top号码
"""
def __init__(self):
self.page = 1
self.cur_url = "h0?start={page}filter=type="
self.datas = []
self._top_num = 1
print u"豆瓣电影爬虫准备就绪, 准备爬取数据..."
def get_page(self, cur_page):
"""
根据当前页码爬取网页HTML
Args:
cur_page: 表示当前所抓取的网站页码
Returns:
返回抓取到整个页面的HTML(unicode编码)
Raises:
URLError:url引发的异常
"""
url = self.cur_url try:
my_page = urllib2.urlopen(url.format(page=(cur_page - 1) * 25)).read().decode("utf-8") except urllib2.URLError, e: if hasattr(e, "code"): print "The server couldn't fulfill the request."
print "Error code: %s" % e.code elif hasattr(e, "reason"): print "We failed to reach a server. Please check your url and read the Reason"
print "Reason: %s" % e.reason return my_page def find_title(self, my_page):
"""
通过返回的整个网页HTML, 正则匹配前100的电影名称
Args:
my_page: 传入页面的HTML文本用于正则匹配
"""
temp_data = []
movie_items = re.findall(r'span.*?class="01e0-4775-74c3-b30c title"(.*?)/span', my_page, re.S) for index, item in enumerate(movie_items): if item.find("nbsp") == -1:
temp_data.append("Top" + str(self._top_num) + " " + item)
self._top_num += 1
self.datas.extend(temp_data) def start_spider(self):
"""
爬虫入口, 并控制爬虫抓取页面的范围
"""
while self.page = 4:
my_page = self.get_page(self.page)
self.find_title(my_page)
self.page += 1def main():
print u"""
###############################
一个简单的豆瓣电影前100爬虫
Author: Andrew_liu
mender: cy
Version: 0.0.2
Date: 2017-03-02
###############################
"""
my_spider = DouBanSpider()
my_spider.start_spider()
fobj = open('/data/moxiaokai/HelloWorld/cyTest/blogcode/top_move.txt', 'w+') for item in my_spider.datas: print item
fobj.write(item.encode("utf-8")+'\n')
time.sleep(0.1) print u"豆瓣爬虫爬取完成"if __name__ == '__main__':
main()123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102
运行结果:
在开发者工具中观察到该请求的Status Code是302,Response Headers中Location是该预告片的真正地址(该地址是时间的函数,不唯一! 但测试表明不同时间生成的不同的地址都能下载该预告片!
#!/usr/bin/env python2.7# encoding=utf-8"""
爬取豆瓣电影TOP250 - 完整示例代码
"""import codecsimport requestsfrom bs4 import BeautifulSoup
DOWNLOAD_URL = 'httn.com/top250/'def download_page(url):
return requests.get(url, headers={ 'User-Agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_11_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/47.0.2526.80 Safari/537.36'
}).contentdef parse_html(html):
soup = BeautifulSoup(html)
movie_list_soup = soup.find('ol', attrs={'class': 'grid_view'})
movie_name_list = [] for movie_li in movie_list_soup.find_all('li'):
detail = movie_li.find('div', attrs={'class': 'hd'})
movie_name = detail.find('span', attrs={'class': 'title'}).getText()
movie_name_list.append(movie_name)
next_page = soup.find('span', attrs={'class': 'next'}).find('a') if next_page: return movie_name_list, DOWNLOAD_URL + next_page['href'] return movie_name_list, Nonedef main():
url = DOWNLOAD_URL with codecs.open('movies', 'wb', encoding='utf-8') as fp: while url:
html = download_page(url)
movies, url = parse_html(html)
fp.write(u'{movies}\n'.format(movies='\n'.join(movies)))if __name__ == '__main__':
main()12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152
简单说明下,在目录下会生成一个文档存放电影名。python2
一般来说,抓取本身并不会违法。问题是,你把抓取的信息放在自己的网站/app里面,进行传播、引流、获利。因为你并不拥有这些内容的版权,直接使用很容易触犯相关法律法规。
简介:
Python是一种广泛使用的解释型、高级和通用的编程语言。Python由荷兰数学和计算机科学研究学会的Guido van Rossum创造,第一版发布于1991年,它是ABC语言的后继者,也可以视之为一种使用传统中缀表达式的LISP方言。
Python提供了高效的高级数据结构,还能简单有效地面向对象编程。Python语法和动态类型,以及解释型语言的本质,使它成为多数平台上写脚本和快速开发应用的编程语言,随着版本的不断更新和语言新功能的添加,逐渐被用于独立的、大型项目的开发。
Python支持多种编程范型,包括函数式、指令式、结构化、面向对象和反射式编程。Python解释器易于扩展,可以使用C或C++(或者其他可以通过C调用的语言)扩展新的功能和数据类型。Python也可用于可定制化软件中的扩展程序语言。
Python拥有动态类型系统和垃圾回收功能,能够自动管理内存使用,并且其本身拥有一个巨大而广泛的标准库,提供了适用于各个主要系统平台的源码或机器码。
实验室这段时间要采集电影的信息,给出了一个很大的数据集,数据集包含了4000多个电影名,需要我写一个爬虫来爬取电影名对应的电影信息。
其实在实际运作中,根本就不需要爬虫,只需要一点简单的Python基础就可以了。
前置需求:
Python3语法基础
HTTP网络基础
===================================
第一步,确定API的提供方。IMDb是最大的电影数据库,与其相对的,有一个OMDb的网站提供了API供使用。这家网站的API非常友好,易于使用。
第二步,确定网址的格式。
第三步,了解基本的Requests库的使用方法。
为什么我要使用Requests,不使用urllib.request呢?
因为Python的这个库容易出各种各样的奇葩问题,我已经受够了……
第四步,编写Python代码。
我想做的是,逐行读取文件,然后用该行的电影名去获取电影信息。因为源文件较大,readlines()不能完全读取所有电影名,所以我们逐行读取。
1 import requests 2 3 for line in open("movies.txt"): 4 s=line.split('%20\n') 5 urll='htdbapi.com/?t='+s[0] 7 result=requests.get(urll) 8 if result: 9 json=result.text10 print(json)11 p=open('result0.json','a')12 p.write(json)13 p.write('\n')14 p.close()
我预先把电影名文件全部格式化了一遍,将所有的空格替换成了"%20",便于使用API(否则会报错)。这个功能可以用Visual Studio Code完成。
注意,编码的时候选择GBK编码,不然会出现下面错误:
1 UnicodeDecodeError: 'gbk' codec can't decode byte 0xff in position 0: illegal multibyte sequence
第五步,做优化和异常处理。
主要做三件事,第一件事,控制API速度,防止被服务器屏蔽;
第二件事,获取API key(甚至使用多个key)
第三件事:异常处理。
1 import requests 3 4 key=[‘’] 5 6 for line in open("movies.txt"): 7 try: 8 #…… 9 except TimeoutError:10 continue11 except UnicodeEncodeError:12 continue13 except ConnectionError:14 continue
下面贴出完整代码:
1 # -*- coding: utf-8 -*- 2 3 import requests 4 import time 5 6 key=['xxxxx','yyyyy',zzzzz','aaaaa','bbbbb'] 7 i=0 8 9 for line in open("movies.txt"):10 try:11 i=(i+1)%512 s=line.split('%20\n')13 urll='dbapi.com/?t='+s[0]+'apikey='+key[i]14 result=requests.get(urll)15 if result:16 json=result.text17 print(json)18 p=open('result0.json','a')19 p.write(json)20 p.write('\n')21 p.close()22 time.sleep(1)23 except TimeoutError:24 continue25 except UnicodeEncodeError:26 continue27 except ConnectionError:28 continue
接下来喝杯茶,看看自己的程序跑得怎么样吧!
没有的事,如果是这样的话,百度,谷歌这些搜索引擎公司也是犯法的了。他们也是爬取别人的网站,获取信息,给用户用的。其实搜索引擎就是一种爬虫。
如果网站本身不做鉴别,网站会认为爬虫和一般的浏览器的行为是一样的。
尾页投稿 二0 一 九垂纶 岛如今 谁掌握 ,贴秘外国为什么没有敢光复 垂纶 岛 少乡号SEO博员 • 二0 二0年 七月 一日 0 九:0 三: 四 七 • 投稿 SEO 借忘患上 二0 一 二年九一八先后天下 各天发作 阵容 浩荡 的反日游止吗?可谓 一 九 七 二年外日国交 一般化此后,...
第 一页 剧情吧工夫 : 二0 一 四- 一 二-0 六 一 六: 三 二: 二 一 尔的抗和 三之铁血沉偶兵第 一散剧情先容 乔掌柜送弹药给天高党被汉忠领现 一 九 四 四年,抗日和平靠近 序幕,日军断港绝潢 对于旭日 乡的天高党入止血洗。 乔掌柜负责输送 一批兵器 给天...
寄熟兽高领插件的罪用列表Creation Date: 二0 一 九-0 五- 一 六T0 七: 一 二: 三0Zpython 三 arjun.py -u ://api.example.com/endpoint --get 最近 , 三 六0 威胁谍报 中间 宣布 了《寰球高...
如许 当地 便依照 孬了一个tp 五的框架了。第两步:入进NGINX容器,经由过程 docker ps审查docker容器的container-id,运用docker exec敕令 入进到容器外部。 一 二 三 四 五 六 七 八ert@ertiaodeMac-mini ~/develop/en...
情形 一:最初一次提接且已push执止如下敕令 :git co妹妹it --amendgit会挨谢$EDITOR编纂 器,它会添载此次 提接的日记 ,如许 咱们便否以正在下面编纂 ,编纂 后保留 即实现此次的修正 。情形 两:最初一次提接且未push到办事 器执止如下敕令 :git co妹妹it -...
运用Nginx作Web办事 器进程 外,碰着 过如下几个答题:一、nginx封动掉 败 一systemctl start nginx.service封动nginx掉 败,报错疑息以下:Starting nginx: nginx: [emerg] bind() to 0.0.0.0:AV女优* fai...