import requests import lxml.html#Xpath就是根据一定的网页地址定位到某个值 import csv import os #访问url,获取网页信息 def get_douban_movie(taget_url): headers = { # headers就是一个请求头 "User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36" } req = requests.get(url=taget_url, headers=headers) req.encoding='utf-8' return req.content #从网页信息中,选择class=info中的整段信息,再从info中获取title,link等信息 #创建一个列表,将每个电影的内容存入一个字典中,将所有书的字典放在一个列表里面 def get_movie_info(source): selector = lxml.html.document_fromstring(source) info_data=selector.xpath('//div[@class="info"]') info_list=[] for eachinfo in info_data: info_dict={} title=eachinfo.xpath('div[@class="hd"]/a/span[@class="title"]/text()')[0] link=eachinfo.xpath('div[@class="hd"]/a/@href')[0] star=eachinfo.xpath('div[@class="bd"]/div[@class="star"]/span[@class="rating_num"]/text()')[0] quote=eachinfo.xpath('div[@class="bd"]/p/span[@class="inq"]/text()')[0] info_dict['title']=title info_dict['link']=link info_dict['star']=star info_dict['quote']=quote info_list.append(info_dict) return info_list #将内容写入到csv文件中,首先判断目录是否存在,不存在则创建 #将文本内容写入到csv文件中,使用的读写方式为w,如果是二进制类型的,则使用ab方式 #将列表中的每个字典内容,单次写入到文件中,如果不想要文件中有空行,则设置newline="" def create_csv(info_list): if not os.path.exists('./MovieCsv'): os.mkdir('MovieCsv') with open('./MovieCsv/movieDouban.csv',"w",newline="") as f: writer=csv.DictWriter(f,fieldnames=['title','link','star','quote']) writer.writeheader() for eachmove in info_list: writer.writerow(eachmove) #主函数调用 #其中观察url链接中的数字变化,和页数产生的关联,从而使用循环来完成多页的爬虫 #循环控制页数for i in range(5) if __name__ == '__main__': taget_url = 'https://movie.douban.com/top250?start={}&filter='# 当前页数-1*25,此处的0是变量 taget_list=[] for i in range(4): count = i * 25 taget_urlq = taget_url.format(count) taget_data=get_douban_movie(taget_urlq) taget_list+=get_movie_info(taget_data) create_csv(taget_list)
成果截图: