【实验目的】

1.练习爬取电影信息
2.练习将爬取到的数据存入Mysql数据库中

【实验原理】

网络爬虫是指在网上进行数据抓取的程序,用来抓取特定网页的HTML数据。虽然可以利用一些库开发一个爬虫程序,但是使用框架可以大大提高效率,缩短开发时间。Scrapy是一个使用Python编写的,轻量级的,简单轻巧,并且使用起来非常的方便。Scrapy是一套基于Twisted的异步处理框架,是纯python实现的爬取框架,用户只需要定制开发几个模块就可以轻松实现一个爬虫,用来抓取网页内容或者各种图片。
本节课以Scrapy框架爬取TOP250的电影信息,首先我们分析源码,我们发现所有信息都放在一个单独的li标签中,而且在li下还有一个class为’item’的div包裹着所有的信息,我们取其中的评分、电影名和简介。
3.1 Scrapy爬取豆瓣电影信息(局域网) - 图1
由于每页只能显示25条数据,我们还需判断是否存在下一页,如果存在则继续爬取,最后完成爬取10页共250条数据。

【实验环境】

Linux Ubuntu 16.04
Python 3.5
PyCharm
Scrapy
mysql-5.5.53

【实验内容】

1.使用Scrapy框架爬取top250中的电影信息

2.设计mysql中的表,将爬取到的数据存入mysql中

【实验步骤】

1.打开终端模拟器,创建一个目录/data,密码:zhangyu,创建一个名为douban的Scrapy项目。

  1. sudo mkdir /data
  1. sudo chown -R zhangyu.zhangyu /data
  1. cd /data
  2. scrapy startproject douban

3.1 Scrapy爬取豆瓣电影信息(局域网) - 图2

2.打开Pycharm,选择File中的Open,打开douban项目。

3.1 Scrapy爬取豆瓣电影信息(局域网) - 图3
选择/data中的douban。
3.1 Scrapy爬取豆瓣电影信息(局域网) - 图4

3.在终端模拟器中,切换到douban目录中,创建Spidier。

这里我们要爬取movie.douban.com中的文章。

  1. cd /data/douban
  2. scrapy genspider doubanspider http://192.168.1.100:40000/douban

3.1 Scrapy爬取豆瓣电影信息(局域网) - 图5
我们可以看到spiders中的doubanspider已经创建出来了。

4.接下来我们需要编写doubanspider的代码,实现爬取电影中的标题、评分及简介。

完整代码为:

  1. import scrapy
  2. class doubanspider(scrapy.Spider):
  3. #项目名
  4. name = "doubanspider"
  5. #当网站设置了防爬措施,我们需要加上headers伪装浏览器发送请求,不添加以下信息将爬取不到数据
  6. headler = {
  7. 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 '
  8. 'Safari/537.36',
  9. 'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8'
  10. }
  11. #目标网站的url
  12. start_urls = [
  13. 'http://192.168.1.100:40000/douban'
  14. ]
  15. #重写scrapy方法
  16. def start_requests(self):
  17. for i in range(1, 11):
  18. oneurl = "http://192.168.1.100:40000/douban/" + str(i)
  19. yield scrapy.Request(url=oneurl, callback=self.parse, headers=self.headler)
  20. #使用css选择器,通过for循环遍历电影标题、评分及简介
  21. def parse(self, response):
  22. for quote in response.css('div.item'):
  23. yield {
  24. "film_name": quote.css('div.info div.hd a span.title::text').extract_first(),
  25. "score": quote.css('div.info div.bd div.star span.rating_num::text').extract(),
  26. "Introduction": quote.css('div.info div.bd p.quote span.inq::text').extract()
  27. }

5.选择setting.py文件,将其中的ROBOTSTXT_OBEY参数由True改为False。

3.1 Scrapy爬取豆瓣电影信息(局域网) - 图6
3.1 Scrapy爬取豆瓣电影信息(局域网) - 图7
3.1 Scrapy爬取豆瓣电影信息(局域网) - 图8
main.py文件中的内容为:

  1. from scrapy import cmdline
  2. name='doubanspider -o douban.csv'
  3. cmd = 'scrapy crawl {0}'.format(name)
  4. cmdline.execute(cmd.split())

7.最后,我们在main.py文件中,执行Run ‘main’。

3.1 Scrapy爬取豆瓣电影信息(局域网) - 图9
我们可以看到,爬取到的数据正源源不断的输出。
3.1 Scrapy爬取豆瓣电影信息(局域网) - 图10
8.我们可以在/data/douban中查看到生成的douban.csv文件。

  1. ls /data/douban

9.查看douban.csv文件。

  1. cat /data/douban/douban.csv

3.1 Scrapy爬取豆瓣电影信息(局域网) - 图11
接下来,我们开启mysql数据库,将douban.csv文件传入mysql中。(密码:zhangyu)

10.启动mysql服务。

  1. sudo service mysql start

3.1 Scrapy爬取豆瓣电影信息(局域网) - 图12

11.启动mysql(密码:strongs)

  1. mysql -u root -p

3.1 Scrapy爬取豆瓣电影信息(局域网) - 图13
12.创建douban数据库并使用douban数据库。

  1. CREATE DATABASE douban CHARACTER SET utf8 COLLATE utf8_general_ci;
  2. use douban;

3.1 Scrapy爬取豆瓣电影信息(局域网) - 图14
13.创建doubantb表,包含电影名(film_name),字符类型为varchar(10),评分(score),字符类型为varchar(10),评价(Introduction),字符类型为longtext,doubantb表中三个字段的顺序须与douban.csv中数据字段的顺序保持一致。

  1. create table doubantb
  2. (
  3. score varchar(10) ,
  4. Introduction longtext ,
  5. film_name varchar(10) not null
  6. );

3.1 Scrapy爬取豆瓣电影信息(局域网) - 图15
14.查看表结构

  1. desc doubantb;

3.1 Scrapy爬取豆瓣电影信息(局域网) - 图16

15.将/data/douban/目录中的douban.csv文件传入mysql中的doubantb中。

  1. load data infile '/data/douban/douban.csv' into table doubantb fields terminated by ',' optionally enclosed by '"' escaped by '"' lines terminated by '\r\n';

3.1 Scrapy爬取豆瓣电影信息(局域网) - 图17

16.查看前十条数据

  1. select * from doubantb limit 10;

3.1 Scrapy爬取豆瓣电影信息(局域网) - 图18
至此,我们的实验就结束了!