对于了解python的同学来说,爬虫应该是经常看到和听到的词了,而且爬虫也是我们学习python很好的一种训练方式,主要是因为爬虫入门简单,它也是学习python的基础,同时也是非常实用的。下面我将我学习爬虫的一个案例分享一下,也是一个记录方便后面自己回忆。
爬虫一般是以url为起点,通过url获取到更多的数据,然后从这些数据中找出你想要的数据,最后进行记录整合,变成你最终想要的效果。
本次爬虫主要使用requests和lxml两个库
#!/usr/bin/env python
# _*_ coding:utf-8 _*_
# @File : doubanmovie.py
# @Author: longgege
# @Date : 2020/6/12
# @Desc : PyCharm
import requests
from lxml import html
#被爬取网站的消息头
headers = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/70.0.3538.77 Safari/537.36'
}
# 爬取页面内容
def moviesInfo(url):
#根据url和headers获取网站全部内容
reponse = requests.get(url=url, headers=headers).content
#通过html模块解析上面获取的内容
bs = html.fromstring(reponse)
num = 0
# print("+++++++++++++++++++++", bs.xpath('//div[@class ="info"]'))
#通过xpath获取"div[@class ="info"]"的所有节点,即豆瓣的所有电影信息,每一个电影信息为一个"div[@class ="info"]",因此这里循环获取具体信息
for i in bs.xpath('//div[@class ="info"]'):
try:
#序列
# print("==========num:",num)
#因为这个序列是在"div[@class ="info"]"外面(即bs里面),所以这边是用的bs.xpath,而不是i.xpath
movieNo = bs.xpath('//*[@id="content"]/div/div[1]/ol/li[{}]/div/div[1]/em/text()'.format(num+1))[0]
# movieNo = bs.xpath('//*[@id="content"]/div/div[1]/ol/li[1]/div/div[1]/em/text()')
# movieNo = bs.xpath('//*[@id="content"]/div/div[1]/ol/li[numa]/div/div[1]/em/text()',numa=num)
# print("==========numa:",numa)
# 电影名称
movieName = i.xpath('div[@class="hd"]/a/span[@class="title"]/text()')[0]
#评星
mobieStart = i.xpath('//div[@class="star"]/span[2]/text()')[num]
# 电影信息
movieInfo = i.xpath('div[@class="bd"]/p[1]/text()')
# 电影简述
movieDescribes = i.xpath('//span[@class="inq"]/text()')
# 电影评论人数
movieNums = i.xpath('//div[@class="star"]/span[4]/text()')
# 上映国家
moviePeople = movieInfo[1].replace(" ", "").replace("\n", "").split("/")[1]
# 电影上映时间
movieDate = movieInfo[1].replace(" ", "").replace("\n", "").split("/")[0]
# 获取电影的每一条简述
movieDescribe = movieDescribes[num]
# 获取每一个电影的评论人数
movieNum = movieNums[num]
#向文件中追加内容
with open(file_name, 'a+', encoding="utf-8") as file:
file.writelines("%s %s %s %s %s %s %s\n" % (movieNo,movieName, mobieStart, movieNum, moviePeople, movieDate, movieDescribe))
num += 1
except Exception as e:
print(e)
break
if __name__ == '__main__':
num = 0
file_name = '2020movies_top250.txt'
#新建文件,并向文件中写入首行作为标题行
open(file_name, 'w+', encoding="utf-8").writelines("序列 电影名称 评星 评论人数 上映国家 上映时间 简述\n")
open(file_name, 'a+', encoding="utf-8").writelines("=========================================================================\n")
#这里rang(10)是循环10页
for i in range(10):
#指定要爬虫的网页url
page = 'https://movie.douban.com/top250?start=%d&filter=' % num
moviesInfo(page)
#指定每页多少部电影,这里是每页25部电影,共10页,因此是250部电影
num += 25
代码中都已经加了注释,这里就不再对代码进行一一说明了。
因为代码中是在当前工程目录下生成“2020movies_top250.txt”文件,将数据写入到该文件中,打开文件内容展示部分内容如下: