Requests库+正则爬取猫眼电影Top100
时间: 2018-09-13来源:OSCHINA
前景提要
「深度学习福利」大神带你进阶工程师,立即查看>>>
声明 :此篇文章主要是观看静觅教学视频后做的笔记,原教程地址: https://cuiqingcai.com/
流程框架
1.抓取单页内容:利用requests请求目标站点,得到单个网页HTML代码,返回结果。
2.正则表达式分析:根据HTML代码分析得到电影的名称,主演,上映时间,评分,图片链接等信息
3.开启循环及多线程:对多页内容遍历,开启多线程提高抓取速度
4.保存至文件:通过文件的形式将结果保存,每一部电影一个结果一行Json字符串
流程设计
1.maoyan_Spider函数是一个整体的爬虫调度器,其中包含了请求的url地址,headers请求头 def maoyan_Spider(offset): """ 作用:猫眼电影调度器 offset:get的页码参数 """ url = 'http://maoyan.com/board/4?offset=' + str(offset) headers = { 'User-Agent':'Mozilla/5.0 (X11; Linux x86_64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/67.0.3396.62 Safari/537.36' } # 获取单页html html = get_one_page(url, headers) # print(html) # 将每一页的电影信息解析,并写入文件中 for item in parse_one_page(html): # print(item) item_str = json.dumps(item, ensure_ascii=False) write_to_file(item_str)
2.首先以单个网页源代码进行分析,进入到猫眼电影官网榜单,通过构造请求可以拿到http://maoyan.com/board/4?的源码 def get_one_page(url, headers): """ 作用:获取一页的源码 url:请求地址 headers:请求头 """ try: response = requests.get(url, headers=headers) if response.status_code == 200: return response.text return None except RequestException: return None
3.接下来感觉整个爬虫的难点就在于解析,源码有了,这里我使用的还是正则来提取数据,稍有字符写错,可能就解析不出来了。下面以Top榜第一名为例进行解析,并转化为json格式保存 <dd> <i class="board-index board-index-1">1</i> <a href="/films/1203" title="霸王别姬" class="image-link" data-act="boarditem-click" data-val="{movieId:1203}"> <img src="//ms0.meituan.net/mywww/image/loading_2.e3d934bf.png" alt="" class="poster-default"> <img alt="霸王别姬" class="board-img" src="http://p1.meituan.net/movie/20803f59291c47e1e116c11963ce019e68711.jpg@160w_220h_1e_1c"> </a> <div class="board-item-main"> <div class="board-item-content"> <div class="movie-item-info"> <p class="name"><a href="/films/1203" title="霸王别姬" data-act="boarditem-click" data-val="{movieId:1203}">霸王别姬</a></p> <p class="star">主演:张国荣,张丰毅,巩俐</p> <p class="releasetime">上映时间:1993-01-01(中国香港)</p> </div> <div class="movie-item-number score-num"> <p class="score"><i class="integer">9.</i><i class="fraction">6</i></p> </div> </div> </div> </dd>
可以得出其字符串匹配规则是 '<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name"><a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>'
4.然后通过使用re模块findall方法找到所有电影信息,电影信息包含排名,图片地址,电影名称,主演,上映时间,评分。findall方法返回的是一个元素为元组的列表,然后遍历这些元素通过yield生成json字典形式 def parse_one_page(html): """ 作用:解析一页的源码 html:网页源码 """ pattern = re.compile('<dd>.*?board-index.*?>(.*?)</i>.*?data-src="(.*?)".*?name"><a.*?>(.*?)</a>.*?star">(.*?)</p>.*?releasetime">(.*?)</p>.*?integer">(.*?)</i>.*?fraction">(.*?)</i>', re.S) items = pattern.findall(html) # print(items) for item in items: yield { 'index': item[0], 'image': item[1], 'title': item[2], 'actor': item[3].strip()[3:], 'time': item[4].strip()[5:], 'score': item[5]+item[6] }
5.最后是写入文件,因为此处是对每个电影信息进行写入,所以注意写入方法用的是a,不是w。否则写入的内容只有一个电影信息,也就是Top100 def write_to_file(item): """ 作用:往文件中写入内容 item:处理后的单个电影信息 """ with open('result.txt', 'a', encoding='utf-8') as f: f.write(item + '\n')
6.完整源码地址: https://github.com/XiaoFei-97/maoyan_Spider-Top100
原文出处: https://www.jzfblog.com/detail/64 ,文章的更新编辑以此链接为准。欢迎关注源站文章!

科技资讯:

科技学院:

科技百科:

科技书籍:

网站大全:

软件大全:

热门排行