紧接上回我们爬取了电影的列表页,我们也获得了所有详情页的URL,下一步就是解析详情页并提取到我们想要的信息,观察详情页的网页结构,我们想要的内容和对应的结点信息如下。
封面:是一个img结点。其class属性为over
名称:是一个h2结点,其内容是电影名称
类别:是span结点,其内容是电影类别。span结点的外侧是button结点,再外侧的class为categories的div结点。
上映时间:是span结点,其内容包含上映时间,外侧是class为info的div结点。
评分:是一个p结点,其内容便是电影评分。p结点的class属性为score。
剧情简介:是一个p结点,其内容便是剧情简介,其外侧是class为drama的div结点。
详情页的爬取
def scape_detail(url):
return scrape_page(url)
很简单
详情页的解析
def parse_detail(html):
cover_pattern=re.compile('class="item.*?<img.*?src="(.*?)".*?class="cover">',re.S)
cover=re.search(cover_pattern,html).group(1).strip() if re.search(cover_pattern,html) else None
name_pattern=re.compile('<h2.*?>(.*?)</h2>')
name=re.search(name_pattern,html).group(1).strip() if re.search(name_pattern,html) else None
published_at_pattern=re.compile('(\d{4}-\d{2}-\d{2}).*?上映')
published=re.search(published_at_pattern,html).group(1).strip() if re.search(published_at_pattern,html) else None
return {
"cover":cover,
"name":name,
"published":published
}
我们根据字典和正则表达式来完成对详情页的提取与分析 。
main方法
def main():
for page in range(1,TOTAL_PAGE+1):
index_html=scrape_index(page)
detail_urls=parse_index(index_html)
# logging.info("detail urls %s",list(detail_urls))
for detail_url in detail_urls:
detail_html=scape_detail(detail_url)
data=parse_detail(detail_html)
logging.info("get detail data %s",data)
save(data)
保存文件并对爬虫代码进行改良
保存数据方法的定义
import json
from os import makedirs
from os.path import exists
RESULTS_DIR='results'
exists(RESULTS_DIR) or makedirs(RESULTS_DIR)
def save(data):
name=data.get("name")
data_path=f'{RESULTS_DIR}/{name}.json'
json.dump(data,open(data_path,'w',encoding='utf-8'),ensure_ascii=False,indent=2)
多进程的改良
if __name__=="__main__":
pool=multiprocessing.Pool()
pages=range(1,TOTAL_PAGE+1)
pool.map(main,pages)
pool.close()
pool.join()