实验目的:
爬取豆瓣电影网top250电影的标题,评分,简介,并导入数据库
实验环境:
Linux Ubuntu 18.04.1
python 3.6.8
Pycharm
Scrapy 1.6.0
mysql 5.7.26
实验过程:
1.进入data目录,创建一个scrapy项目
cd /data
scrapy startproject douban
2.使用pycharm打开刚才创建的项目
3.切换到项目目录,创建一个爬虫
cd /data/douban
scrapy genspider doubanspider https://movie.douban.com/top250
4.编写 doubanspider.py,定制爬虫规则
import scrapy
class doubanspider(scrapy.Spider):
#项目名
name = "doubanspider"
#由于豆瓣电影设置了防爬措施,我们需要加上headers伪装浏览器发送请求,不添加以下信息将爬取不到数据
headler = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 '
'Safari/537.36',
'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
}
#目标网站的url
start_urls = [
'https://movie.douban.com/top250'
]
#重写scrapy方法
def start_requests(self):
for url in self.start_urls:
yield scrapy.Request(url=url, callback=self.parse, headers=self.headler)
def parse(self, response):
#使用css选择器,通过for循环遍历电影标题、评分及简介
for quote in response.css('div.item'):
yield {
"film_name": quote.css('div.info div.hd a span.title::text').extract_first(),
"score": quote.css('div.info div.bd div.star span.rating_num::text').extract(),
"Introduction": quote.css('div.info div.bd p.quote span.inq::text').extract()
}
next_url=response.css('div.paginator span.next a::attr(href)').extract()
#判断是否还有下一页数据,如果有就继续爬,直到爬取完最后一页
if next_url:
next_url="https://movie.douban.com/top250"+next_url[0]
print(next_url)
yield scrapy.Request(next_url,headers=self.headler)
5.选择setting.py文件,将其中的ROBOTSTXT_OBEY参数由True改为False。
6.创建一个main.py
from scrapy import cmdline
name='doubanspider -o douban.csv'
cmd = 'scrapy crawl {0}'.format(name)
cmdline.execute(cmd.split())
7.运行main.py,创建出来douban.csv文件
8.导入数据库
进入数据库
sudo mysql -uroot
创建douban数据库
create database douban;
use douban
创建表
create table doubantb
(
film_name varchar(10) not null,
score varchar(10) not null,
Introduction longtext not null
);
将csv文件导入
load data infile '/data/douban/douban.csv' into table doubantb fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by '\r\n';