缘由:
由于我是一个比较喜欢看电影的人,但是又是个孩子,所以技术改变生活,虽然说直接打开浏览器下载就好了,但是我懒,所以借此机会用Scrapy框架来简单爬取一个电影网站
需要获取的信息:
--电影名称
--上映日期
--影片分类(我不看恐怖片)
--剧情介绍(这是一定要看的)
--下载地址(迅雷,我用这个 --> 迅雷打钱)
分析网页
图中箭头部分就是主页我们想要的部分,想要爬取其他部分也可以更改css选择器的部分代码。
查看源码
观察标签的路径,就有了初步的了解,方便我们下一步解析
开始scrapy-spider爬虫书写
进入自己想进入的文件夹,在cmd窗输入
–scrapy startproject Movies-Spider
创建scrapy工程
进入项目工程下的Spider目录,创建我们自己的spider文件
这样我们就创建好了我们的scrapy项目,并加入到相关文件夹中创建了一个Movies.py文件。
开始编写相关代码
在此之前,我们需要关闭在scrapy工程文件中setting.py的服从robot.txt规则,改为不服从。
#Obey robots.txt rules
ROBOTSTXT_OBEY = False
伪装自己
具体可看浏览器伪装
在item.py中设置返回项,以便我们保存文件
编写spider
import scrapy
import re, requests
from Movies.items import MoviesItem
class moviesSpider(scrapy.Spider):
name = "Movies" # Spider Name if you want to run spider you can get in folder and execute the order : scrapy crawl Movies
start_urls = ['http://www.920hdhd.com/?tz'] # which url we want to request
Url = ""
link = ""
def getLink(self, i):
Bs = {'user-agent': 'Firefox/18.1.0.2145'}
url = "http://www.920hdhd.com" + self.Url[i]
r = requests.get(url, headers=Bs, timeout=60)
r.encoding = r.apparent_encoding
pattern = re.compile(r'generate_down(.*?);', re.S)
Mess = re.findall(pattern, r.text)
link = Mess[0]
link = link[2:]
self.link = link[:-2]
def Sec_prase(self, response):
# <div class="row1"><div class="left">影片名称:</div><div class="row_right"><strong>蜘蛛侠:平行宇宙BD高清中英双字</strong></div></div>
Movies = MoviesItem()
Movies['name'] = response.css('div.row_right strong::text').get()
Movies['classify'] = response.css('div.row_right a::text').get()
Movies['introduce'] = response.css('div.text::text').get()
Movies['download'] = self.link
yield Movies
def parse(self, response):
for div in response.css('div.title'):
# yield {
# # 'sidebar-title': div.css('a::text').getall(),
# 's': div.css('a::attr(href)').getall(),
# # 'len': len(div.css('a::attr(href)').getall())
# }
self.Url = div.css('a::attr(href)').getall()
for i in range(len(self.Url)):
self.getLink(i)
if self.Url[i] is not None:
yield response.follow(self.Url[i], callback=self.Sec_prase)
运行效果图
在cmd窗口输入scrapy crawl Movies -o mo.csv即可获得数据存储成本地文件。