大家好,我是你们的老朋友泽哥,最近在学习Python3.6,于是兴起写了个小小的爬虫
今天我们要爬取得页面是豆瓣电影TOP250,连接如下:http://movie.douban.com/top250?start=0&filter=&type=
附上截图!
我们要获得TOP250对应的电影名,打开F12对HTML报文进行解读
电影名对应的HTML代码如下:
肖申克的救赎
整体代码如下:
文件:get_movieReview.py
from urllib import request
from urllib import error
import re
import excel
excel_name = 'excel/douban_hot_review.xls'
sheet_name = '豆瓣影评'
'''创建一个excel'''
douban_excel = excel.Excel(excel_name,sheet_name)
class DouBanSpider(object):
'''
数据成员:
page: 表示当前处理的页面
cur_url: 表示当前准备抓取的页面
'''
def __init__(self):
self.page = 1
self.cur_url = 'http://movie.douban.com/top250?start={page}&filter=&type='#{page}是可以代替的
self.top = 0
print('开始工作')
'''
cur_page:表示当前处理的界面
return:返回抓取的整个界面的HTML(uicode编码)
'''
def get_html(self,cur_page):
url = self.cur_url
try:
page = request.urlopen(url.format(page = (cur_page - 1) * 25)).read().decode("utf-8")
except error.URLError as e:
if hasattr(e,'code'):
print("HTTPError: the server could not deal with the request")
print("Error code: %s"% e.code)
elif hasattr(e,'reason'):
print("URLError: failed to reach the server")
print("Reason: %s"% e.reason)
return page
'''
page:表示当前抓取到的html文件
功能:将匹配到的内容写入到excel文件中
'''
def find_Info(self,page):
movie_items = re.findall(r'(.*?)',page,re.S)
number = 0
for index,item in enumerate(movie_items):
# print('编号:' + str(index))
# print('编号对应的字符串:' + str(item))
if item.find(" ") != 0 and item.find(" ") == -1:
douban_excel.write(self.top,0,item)
self.top += 1
print('第' + str(self.top) + '个电影名是:' + str(item))
douban_excel.save()
def start_spider(self):
'''爬虫入口'''
while self.page <= 10:
page = self.get_html(self.page)
self.find_Info(page)
self.page += 1
def main():
'''程序入口'''
spider = DouBanSpider()
spider.start_spider()
if __name__ == '__main__':
main()
self.cur_url = 'http://movie.douban.com/top250?start={page}&filter=&type='
注意,标红的地方用到了字符串匹配,第一页start=0,第二页start=25···以此类推,每增加一页,start值增加25。
具体的python3的format函数用法请撮这里!
import xlrd
import xlwt
import os
class Excel:
def __init__(self,excel_name,sheet_name):
global bookWrite
global bookRead
global sheet
self.excel_name = excel_name
self.sheet_name = sheet_name
bookWrite = xlwt.Workbook(encoding = 'utf-8')
sheet = bookWrite.add_sheet(sheet_name,cell_overwrite_ok = True)
#写数据到excel
def write(self,row,col,data):
sheet.write(row,col,data)
#保存数据到文件
def save(self):
if os.path.exists(self.excel_name):
os.remove(self.excel_name)
bookWrite.save(self.excel_name)
else:
bookWrite.save(self.excel_name)
#读取excel数据;单元格
def read(self,sheet_index,row,col):
bookRead = xlrd.open_workbook(self.excel_name)
sheet = bookRead.sheet_by_index(sheet_index)
return sheet.cell(row,col).value #根据行与列获取单元格值
#读取excel数据:单行数据
def read_by_row(self,sheet_index,row):
bookRead = xlrd.open_workbook(self.excel_name)
sheet = bookRead.sheet_by_index(sheet_index) # 根据索引获取工作表
return sheet.row_values(row)
#读取excel数据:单列数据
def read_by_col(self,sheet_index,col):
bookRead = xlrd.open_workbook(self.excel_name)
sheet = bookRead.sheet_by_index(sheet_index)
return sheet.col_values(col)
这个小爬虫给我的收获还是很多的,每一个电影都能爬出两个相同标签的,区别在于第二个标签内容的开头是空格,可能是因为解析html需要用到“utf-8”编码吧,在遇到非中文的html代码时,空格变成了 所以真正的电影名的标签里需要满足以下两点条件:1.没有 2.不能是空格开头。说这么多了,大家自己看一看html就知道个所以然了!