本次练习利用scrapy 爬取了爱奇艺爱情电影(小伙伴可以自行修改爬取其他类型电影)
学习到的主要内容是
- 1.对scrapy 框架中的yield 生成器有了进一步的思考,可以通过它来实现翻页操作
- 2.关于基础url 的搭建,常用的是format/urlencode/占位符
- 3.重点:学习到如何在pipline 中进行配置,将爬取的内容存储为excel格式
下面是代码各模块文件的截图位置
文件位置
本次主要的程序在四大模块里
1.主程序----lovemovie.py
2.items.py
3.pipliens.py
4.settings.py
具体代码和需要修改的(settings.py)如下:
1.主程序---lovemovie.py
import scrapy
from scrapy import Spider,Request
from aiqiyi.settings import *
import logging
from logging import getLogger
import json
from urllib.parse import urlencode#可以将参数通过&链接到一起
from aiqiyi.items import *
class LovemovieSpider(Spider):
name = 'lovemovie'
allowed_domains = ['list.iqiyi.com']
start_urls = ['https://list.iqiyi.com/']
def start_requests(self):
base_url='https://pcw-api.iqiyi.com/search/video/videolists?'
for page in range(1, self.settings.get('PAGE') + 1):
params={
'access_play_control_platform': '14',
'channel_id': '1',
'data_type': '1',
'from': 'pcw_list',
'mode': '11',
'pageNum':page,
'pageSize': '48',
'site': 'iqiyi',
'three_category_id': '6;must',
'without_qipu': '1'
}
url = base_url + urlencode(params)
yield Request(url,callback=self.parse)#迭代器的作用是可以实现翻页
def parse(self, response):
"""
:param response: 迭代的请求
:return: 所有的解析数据
"""
result=json.loads(response.text)
if result.get('data').get('list'):#开始解析
items=result.get('data').get('list')
aiqiyifilm_info=AiqiyiItem()#首先实例化item.py 模块
for item in items:
aiqiyifilm_info['film_description']=item.get('description')
aiqiyifilm_info['full_time'] = item.get('duration')
aiqiyifilm_info['formatperiod'] = item.get('formatPeriod')
aiqiyifilm_info['film_name'] = item.get('name')
aiqiyifilm_info['play_url'] = item.get('playUrl')
aiqiyifilm_info['score'] = item.get('score')
aiqiyifilm_info['actors'] = item.get('secondInfo')
yield aiqiyifilm_info#运行后会在terminal 端进行,随后将内容在pipline模块内进行保存
2.itmes.py
import scrapy
from scrapy import Item,Field
class AiqiyiItem(Item):
film_description=Field()#电影描述
full_time=Field()#影片时长
formatperiod=Field()#上映时间
film_name=Field()#电影名称
play_url=Field()#播放连接
score=Field()#分数
actors=Field()#主演名称
3.pipline.py(process_item 函数名称是固定的,最好不要修改)
from openpyxl import Workbook#注意是大写
class ExcelPipeline(object):
def __init__(self):
self.wb=Workbook()#实例化
self.ws=self.wb.active#激活
self.ws.append(['故事梗概','电影时长','上映时间','电影名字','播放链接','电影评分','主演名字'])
def process_item(self,item,spider):#这里的参数spider 实际上是Spider的实例,item就是主程序中的aiqiyifilm_info,模块自动识别为item
line=[item['film_description'],item['full_time'],item['formatperiod'],item['film_name'],item['play_url'],item['score'],item['actors']]
self.ws.append(line)
self.wb.save('aiqiyi_film.xlsx')
return item #pipline 必须返回迭代对象,或者异常值
4.settings.py
开通管道
爬取爱情电影页数--当时爬取只有19页
本例子还算比较简单,没有反爬,无需验证,后续还会不断练习