在开始爬取之前,必须创建一个新的 Scrapy 项目。进入自定义的项目目录中,运行下列命令:
创建项目命令
scrapy startproject 项目名称
切换到项目下
cd 项目名称目录
同时找到项目所见的文件夹 ,使用pycharm打来开(我用的是pycharm) 大致结构如下
下面来简单介绍一下各个主要文件的作用:
scrapy.cfg :项目的配置文件
mySpider/ :项目的 Python 模块,将会从这里引用代码
mySpider/items.py :项目的目标文件
mySpider/pipelines.py :项目的管道文件
mySpider/settings.py :项目的设置文件
mySpider/spiders/ :存储爬虫代码目录
在上一篇提到了整个爬取时的流程,今天我们实战一下 ,使用美剧100这个网站来爬取数据
创建美剧100的项目爬取文件
在之前的cmd命令行下输入,scrapy genspider s_mj100 meijutt.com
结构是 scrapy genspider + 文件名称 + 需要爬取的网站的域名
重新打开pycharm
接下来明确我们需要爬取的内容,在items中写好我们定义的字段(可以通过创建一个 scrapy.Item 类, 并且定义类型为 scrapy.Field 的类属性来定义一个Item(可以理解成类似于 ORM 的映射关系)。)
接下来就可以在我们新建的爬虫文件下写我们的代码了
记住在items下写好字段后需要将items导入到我们的爬取文件下,实例化调用
使用scrapy框架,不需要我们手动请求,框架底层会将请求的结果直接返回给我们使用
我们直接处理返回的内容
如果需要进行二次请求,直接使用callback方法,再写一个函数处理就可以了
拿到我们想要的数据后,打开settings下的pipelines 保存数据
在pipelines中
保存文件
完成!!!!
代码如下
# -*- coding: utf-8 -*-
import scrapy
from day0510.items import MJItem
from lxml import etree
class SMj100Spider(scrapy.Spider):
name = 's_mj100'
allowed_domains = ['www.meijutt.com']
start_urls = ['https://www.meijutt.com/new100.html']
def parse(self, response):
content = response.body.decode('gb2312')
response = etree.HTML(content)
li_list = response.xpath('//ul[@class="top-list fn-clear"]/li')
for li in li_list:
index = li.xpath('./div[1]/i/text()')[0]
name = li.xpath('./h5/a/text()')[0]
state = li.xpath('./span[1]/font/text()')[0]
try:
word = li.xpath('./span[1]/font/span/em/text()')
word = word[0]
except:
word = '本季终'
type = li.xpath('./span[2]/text()')[0]
tv = li.xpath('./span[3]/text()')[0]
time = li.xpath('./div[2]//text()')[0]
detail_url = li.xpath('./h5/a/@href')[0]
detail_url = 'https://www.meijutt.com' +detail_url
item = MJItem()
item['index'] = index
item['name'] = name
item['state'] = state
item['name'] = name
item['word'] = word
item['type'] = type
item['tv'] = tv
item['time'] = time
# yield item
yield scrapy.Request(url=detail_url,meta={'data':item,'phantomjs':True},callback=self.parse_detail)
def parse_detail(self,response):
item = response.meta
yield item