目录
4567电影网电影信息爬取
1.需求分析
4567电影网首页如下,点击一部电影,看看具体的页面呈现。
电影信息有电影名,类型,地区,年份,主演,等等。在这里我们仅提取电影名和电影简介
进入到电影分类页面,我们的目的是提取某一类型所有电影的名字和简介
2.URL分析
1.一级URL分析
动作栏的电影URL为:https://www.4567tv.tv/index.php/vod/show/id/5/page/1.html
从这个URL可以得出两条信息:
1.动作类型的电影id号为5
2.第一页的html为1.html,第二页为2.html,依次推列
2.二级URL分析
在动作栏电影页面右键查看源代码,分析源代码得到他的链接地址。
得出的结果为:/movie/index29612.html
这显然不是一个完整的URL,我们在动作栏页面点击肥龙过江,看到他的URL如下若是,于是我们得出结论。
二级URL="https://www.4567tv.tv"+链接地址
3.正则表达式分析
1.二级URL正则表达式分析
我们想要的是href里面的那一次,分析划线部分的代码,发现规律,于是正则表达式可以这么写:
<a class="stui-vodlist__thumb lazyload" href="(.*?)".*?</a>
以<a class="stui-vodlist__thumb lazyload" 开头,(.*?)提取子模式,.*?非贪婪匹配后续,直到</a>
2.电影名和简介正则表达式分析
我们要提取的信息是电影名和简介,根据分析,发现电影名以<div class="stui-content__detail">开头,简介以<span class="detail-content" style="display: none;">开头。那么正则表达式如下:
<div class="stui-content__detail">.*?<h1 class="title">(.*?)</h1>.*?<span class="detail-content" style="display: none;">(.*?)</span>
注意:这里有两个子模式,所以返回的结果为元组列表
4.程序设计
1.定义一个类,Movies4567_spider封装方法
2.初始化信息,包括一级URL和正则,二级URL和正则,请求头代理
3.定义获取页面的函数:get_html()
4.定义获取一级页面内容的函数(获取二级页面的URL):parse_first()
5.定义获取二级页面内容的函数(获取电影名和简介):parse_second()
6.定义正则匹配函数,返回匹配列表(这里单独来写是为了一二级页面的解耦):regex_func()
7.定义入口函数:run()
5.程序代码
from urllib import request
import re
import time
import random
class Movies4567_spider(object):
def __init__(self):
self.frist_url="https://www.4567tv.tv/index.php/vod/show/id/5/page/{}.html"
self.second_url="https://www.4567tv.tv"
self.headers = {
"User-Agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/78.0.3904.108 Safari/537.36"}
self.regex_first = '<a class="stui-vodlist__thumb lazyload" href="(.*?)".*?</a>'
self.regex_second = '<div class="stui-content__detail">.*?<h1 class="title">(.*?)</h1>.*?<span class="detail-content" style="display: none;">(.*?)</span>'
#获取页面
def get_html(self,url):
req = request.Request(url=url, headers=self.headers)
rep = request.urlopen(req)
html = rep.read().decode("utf-8","ignore")
return html
#提交html页面,正则表达式regex,返回列表
def regex_func(self,regex,html):
pattern=re.compile(regex,re.S)
lists=pattern.findall(html)
return lists
#一级页面:获取二级页面的url
def parse_first(self,first_url):
html_first=self.get_html(first_url)
#获取到二级页面的url
list_second=self.regex_func(self.regex_first,html_first)
print(list_second)
#对二级页面做信息提取
for i in list_second:
# url拼接
url_second=self.second_url+i
item=self.parse_second(url_second)
print(item)
time.sleep(random.uniform(1,2))
#处理二级页面,获取电影名和简介
def parse_second(self,second_url):
#下载页面内容
html_second=self.get_html(second_url)
#返回匹配内容
info=self.regex_func(self.regex_second,html_second)
#将返回内容打包成集合返回
items={}
items["name"]=info[0][0]
items["detail"]=info[0][1]
return items
#入口函数
def run(self):
#获取一到第十页
for i in range(1,10):
#url拼接
url=self.frist_url.format(i)
self.parse_first(url)
if __name__ == "__main__":
spider=Movies4567_spider()
spider.run()