正则表达式和豆瓣Top250的爬取练习
datawhale任务2-爬取豆瓣top250
正则表达式正则表达式的功能用于实现字符串的特定模式精确检索或替换操作。
常用匹配模式
常用修饰符
基本方法
豆瓣250页面分析豆瓣Top250是包含250部电影,此次爬取的数据为之250部电影的排名,电影名,导演及国家。 url为: 豆瓣有反爬虫,如果过多请求会被封,所以先建立一个文件夹用于存储以爬取的网页,如果下次爬取本地有相应的文件,就不会发起网络请求,从而节省下时间,也不会吸引豆瓣反爬系统的注意。 if 'cached' not in os.listdir('./'): os.system('mkdir cached') listdir = os.listdir("./cached") path = './cached/' def download(index,url,listdir,path): # 下标,目标网址,已缓存的文件,文件保存路径 target_file = "{}.html".format(index) target_url = url.format(index * 25) if target_file not in listdir: # 对应的 html 没有下载下来 html = requests.get(target_url,headers=headers) html.encoding = 'utf-8' with open(path + target_file,'w+') as file: file.write(html.text) html = html.text else: with open(path + target_file,'r') as file: html = file.read() return html 要爬取的信息是排名,电影名,导演,国家 排名在字符串的位置如下 实际是这样的 电影名位于 three_pattern = re.compile(('<em class="">(.*?)</em>.*?<span class="title">(.*?)</span>' '.*?<p class="">.*?导演:(.*?) '),re.S) 刚开始时原是把国家的正则匹配也写在一起,后来发现那样会导致有些数据无法匹配,所以分开写,如下 nation_pattern = re.compile('<br>.*?/ (.*?) /.*?</p>',re.S) 完整代码""" datawhale爬虫任务2 任务:爬取豆瓣电影250 分析 URL,有一个GET参数,start每次变化增加250 https://movie.douban.com/top250?start=0 鉴于豆瓣电影会反爬虫,故将内容先爬下本地,再分析 """ import requests import os import re # (提取名次,片名,导演),(国家) three_pattern = re.compile(('<em class="">(.*?)</em>.*?<span class="title">(.*?)</span>' '.*?<p class="">.*?导演:(.*?) '),re.S) nation_pattern = re.compile('<br>.*?/ (.*?) /.*?</p>',re.S) headers = { 'User-Agent': ('Mozilla/5.0 (X11; Linux x86_64)' ' AppleWebKit/537.36 (KHTML,like Gecko)' ' Chrome/68.0.3440.106 Safari/537.36') } class Movie(object): def __init__(self,rnd,n): # rnd: 名次,名字,导演 # n: 国家 self.info = { '排名': rnd[0],'电影名': rnd[1],'导演': rnd[2],'国家': n } def __repr__(self): return str(self.info) def download(index,'r') as file: html = file.read() return html def parse(html): # 分析面页面,提取数据 # 名次,影片名称,导演 rank_name_dire = re.findall(three_pattern,html) # 国家 nation = re.findall(nation_pattern,html) info = [Movie(i[0],i[1]) for i in zip(rank_name_dire,nation)] for i in info: print(i) def main(): if 'cached' not in os.listdir('./'): os.system('mkdir cached') listdir = os.listdir("./cached") path = './cached/' url = 'https://movie.douban.com/top250?start={}' for i in range(10): html = download(i,path) parse(html) print("结束") if __name__ == '__main__': main() 参考资料
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |