上一篇学了xpath,那么我们趁热打铁,用xpath和python来写一个简单的小爬虫,爬取豆瓣电影top250的电影名字和评分,并将其写入到本地txt文件中。
好了进入正题。
通过对网页进行分析,我们可以看出所有的电影都在一个li标签中,这意味着我们可以利用同样的xpath规则找到它们
然后我们在分析每一个电影的具体情况
通过分析我们可以轻松的用xpath找到我们想要的信息
电影名://div[@class=”item”]//a//span[@class=”title”][1]/text()
评分://div[@class=”item”]//span[@class=”rating_num”]/text()
(这里我的xpath规则写的比较简陋,如果老铁追求完美的话,可以写的严谨一点!)
#获得评分列表
star_list=content.xpath('//div[@class="item"]//span[@class="rating_num"]/text()')
#获得电影名列表
name_list=content.xpath('//div[@class="item"]/a//span[@class="title"][1]/text()')
#将两个list列表整合为tuple列表
info_list=zip(name_list,star_list)
for info in info_list:
#拼接信息
info=info[0]+"(评分:"+info[1]+")\n"
这里我们使用了zip函数将将两个list列表整合为tuple列表,然后再将其重新拼接方便写入文件
关于zip函数的使用一张图,直接搞定
豆瓣电影top250一共有10,每一页的url地址如下
https://movie.douban.com/top250?start=0
https://movie.douban.com/top250?start=25
………………………………
https://movie.douban.com/top250?start=225
因此我们
#页码
self.index=0
self.url="https://movie.douban.com/top250?start="
#爬虫开关
self.switch=True
while self.switch==True:
#拼接url并获取数据
douban_url=self.url+str(self.index)
#将url地址交给geinfo函数处理,获得信息
self.getinfo(douban_url)
#判断是否到了最后一页
if self.index<225:
self.index+=25
time.sleep(3)
else:
#退出循环
self.switch=False
print("程序结束")
我们这样就可以搞定它!
完整代码如下
# -*- coding:utf-8 -*-
from urllib import request, parse
#使用lxml的etree库
from lxml import etree
import time
class DoubanMoive():
def __init__(self):
'''
初始化一些数据
'''
#页码
self.index=0
self.url="https://movie.douban.com/top250?start="
#爬虫开关
self.switch=True
def gethtml(self,url):
'''
处理加载页面
将html解析为xml文档,并返回给getinfo函数
'''
headers={ "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.103 Safari/537.36"}
req = request.Request(url, headers=headers)
html = request.urlopen(req).read().decode("utf-8")
content=etree.HTML(html)
return content
def getinfo(self,url):
'''
获取图片,名字,和评分等信息
将信息交给download函数处理
'''
content=self.gethtml(url)
#评分列表
star_list=content.xpath('//div[@class="item"]//span[@class="rating_num"]/text()')
#电影名
name_list=content.xpath('//div[@class="item"]/a//span[@class="title"][1]/text()')
#将两个list列表整合为tuple列表
info_list=zip(name_list,star_list)
for info in info_list:
#拼接信息
info=info[0]+"(评分:"+info[1]+")\n"
#将追加信息写入到text文本中
with open("douban.txt","a") as f:
f.write(info)
def startswitch(self):
#判断爬虫是否执行
while self.switch==True:
#拼接url并获取数据
douban_url=self.url+str(self.index)
self.getinfo(douban_url)
#判断是否到了最后一页
if self.index<225:
self.index+=25
time.sleep(3)
else:
self.switch=False
print("程序结束")
if __name__ == '__main__':
douban=DoubanMoive()
douban.startswitch()
运行结果:
250条不多不少,刚好爬取完毕!噢耶!