python爬虫2:对于电影天堂网站的进行爬取想要的内容

it2024-11-25  15

接上一篇再写一个demo,实现对于电影天堂网站的进行爬取想要的内容(如国内最新的电影的标题、海报、演员等等),并且按照一定的格式保存在.txt文件中。 下面展示 代码。

# 本demo实现的是对电影天堂的国内电影详情进行爬取、提取想要的内容并且按照一定的格式保存在.txt文件中 from lxml import etree # 这个案例里面用的比较多的etree方法中的就是格式的转换,调用了.tostring,转.HTML(text) import requests movies = [] BASE_DOMAIN = 'https://www.ygdy8.net' # 设置headers可以让浏览器不知道这是爬虫,以为是普通用户 headers = { 'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.121 Safari/537.36' } def get_detail_urls(url): """ 本函数实现将传进来的网页中电影详情链接进行整合并返回 """ response = requests.get(url, headers) # 这里获得的内容是一整个网页的信息,十分杂乱 text = response.text html = etree.HTML(text) # 接下来要对这个网页提取我们想要的内容,这个.xpath方法就是路径搜索 detail_urls = html.xpath("//body//table[@class='tbspan']//a/@href") detail_urls = map(lambda url: BASE_DOMAIN + url, detail_urls) # 这个map函数的作用就是传入一个detail_url,然后return一个BASE_DOMAIN + url # 类似匿名函数 return detail_urls def parse_detail_page(url): """ 本函数实现的是将传进来的某一部电影详情链接中的内容进行提取,如海报、标题、导演等等 """ movie = {} # 这一步就是创建了一个名字为movie的字典 response = requests.get(url, headers=headers) text = response.content.decode('gbk') # gbk是这个网站使用的一种解码方式,我们常用的解码方式有UTF-8,在你的.txt文件右下角都有显示。 # 如果使用自动解码的text方法,text = response.text(), 会造成乱码 html = etree.HTML(text) img = html.xpath("//div[@id='Zoom']//img/@src") # 通过print(title)就可以看到这个是一个数组,我们要的内容就是数组里面的第一项,也就是下标为0 infos = html.xpath("//div[@id='Zoom']//text()") # 下面是采用了字典的方法进行信息的集中存储 # movie['title'] = title # movie['cover'] = img # 我们可以发现img虽然是一个列表类型,但仍然没办法加上下标提取元素,因为有为空的情况存在 # print(len(img)) 查看是否提取到img链接 # img发现有空列表,加一个判断,如果非空,程序继续,如果是空的那么程序返回 if len(img) != 0: movie['cover'] = img else: return actors = [] for index, info in enumerate(infos): # 对象加上.startswith()方法可以判断是否是以括号中的内容开头的信息 # 同样还有一个.endswith()方法就是看结尾是不是以括号中的内容结尾 if info.startswith('◎片  名'): info = info.replace('◎片  名', " ").strip() movie['title'] = info elif info.startswith('◎译  名'): info = info.replace('◎译  名', " ").strip() # 这边末尾调用了strip()方法就是将改内容转换为纯文本信息 movie['译名'] = info elif info.startswith('◎年  代'): info = info.replace("◎年  代", ' ').strip() movie['year'] = info elif info.startswith('◎产  地'): info = info.replace('◎产  地', " ").strip() movie['county'] = info elif info.startswith('◎类  别'): info = info.replace('◎类  别', " ").strip() movie['type'] = info elif info.startswith('◎主  演'): info = info.replace('◎主  演', " ").strip() # print(info) actors.append(info) for x in range(index + 1, len(infos)): actor = infos[x].strip() if actor.startswith('◎'): break actors.append(actor) # 这个就是调用了数组的append方法往一个数组里面添加内容 movie['actors'] = actors elif info.startswith('◎简  介'): # info = info.replace('◎简  介', ' ').strip() for x in range(index + 1, len(infos)): profile = infos[x].strip() if profile.startswith('◎'): break if profile.endswith('【下载地址】'): break movie['profile'] = profile print(movie) # 这个movie是一个字典,key:value的这种形式,字典中通常调用的几种方法: # 1. get():字典名.get(key,默认值),如果当前key不存在,则返回默认值,如果省略默认值则返回none # 2. keys()方法:字典名.keys()返回字典中的所有键key # 3. values()方法:字典名.values()返回字典中所有的值(value) # 4. items()方法:字典名.items()将键值对以元组的方式返回(key,value) for item in movie.items(): # print(item) 现在的item是一个元组,但是元组并不能写入txt文件里面 # 下面这段代码演示的就是使用items()方法取出这个字典的内容,然后在写入txt文件中 for i in range(len(item)): str1 = str(item[i]) with open('movies.txt', 'a') as fp: # 这个fp只是一个对象而已,它可以换成f、a、等等随便的对象名 # 这个调用的open函数里面的'a'就是往里面直接添加内容,不会清空里面原有的内容 # 如果使用的是'w',就是先清空了再往里面写,特别是在这段代码里面他是使用了for循环, # 不断的往里面写会造成只有最后一次循环的内容会保存在文件里面。 if str1.startswith('cover'): fp.write('*' * 120 + '\n') fp.write(str1 + '\t') if i % 2 == 1: fp.write('\n') # 这一部分对于将数据写进文件很有学习意义。 # 这个和print还是有一定差别的 fp.close() # p.write(str(movie)) # fp.close() def spider(): base_url = 'https://www.ygdy8.net/html/gndy/china/list_4_{}.html' for x in range(1, 8): # 第一个for循环是用来控制总共有7页的 url = base_url.format(x) # print(url) detail_urls = get_detail_urls(url) for detail_url in detail_urls: # 第二个for循环是用来遍历一页中所有电影详情的url parse_detail_page(detail_url) # print(detail_url) if __name__ == '__main__': spider()
最新回复(0)