更更更,来更新一篇。

  • 之前一直在写requests,公司里面被要求用pyspider框架,scrapy都生疏了,来回忆回忆,来个简单点的,抓取个豆瓣的电影top250,把关键字信息存到mysql数据库。

  • 链接:https://movie.douban.com/top250。

  • 先来简单的看下这个网站

  • 抓取思路:
    1.先抓取每个电影的详情链接,进去抓取关键字段信息
    2.分页
    3.存储

  • 创建项目

scrapy startproject douban
  • 创建spider文件
scrapy genspider db_crawler movie.douban.com
  • 修改settings文件
#修改
ROBOTSTXT_OBEY = False
#添加数据库连接信息
SQL_HOST = '127.0.0.1'
SQL_PORT = 3306
SQL_USER = 'root'
SQL_PASSWD = '123456'
SQL_DB = 'crawler'
TABLE_NAME = 'doubantop250'
SQL_CHARSET = 'UTF8'
#修改下载延时
DOWNLOAD_DELAY = 1
#添加上headers
DEFAULT_REQUEST_HEADERS = {'Accept':'text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8','Accept-Encoding':'gzip, deflate, sdch, br','Accept-Language':'zh-CN,zh;q=0.8','Cache-Control':'max-age=0','Connection':'keep-alive','Upgrade-Insecure-Requests':'1','User-Agent':'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/53.0.2785.89 Safari/537.36'
}
#打开item-pipline
ITEM_PIPELINES = {'douban.pipelines.DoubanPipeline': 300,
}
  • 修改 item.py文件,添加上要抓取的关键字
# -*- coding: utf-8 -*-# Define here the models for your scraped items
#
# See documentation in:
# https://doc.scrapy.org/en/latest/topics/items.htmlimport scrapyclass DoubanItem(scrapy.Item):# define the fields for your item here like:# name = scrapy.Field()#电影名字title = scrapy.Field()#导演director = scrapy.Field()#编剧screenwriter = scrapy.Field()#主演actor = scrapy.Field()#类型type = scrapy.Field()#地区region = scrapy.Field()#语言lang = scrapy.Field()#上映日期date = scrapy.Field()#片长leng = scrapy.Field()#别名other_name = scrapy.Field()#评分point = scrapy.Field()#剧情简介introduction = scrapy.Field()
  • 编辑主要的spider.py文件, 抓取主程序
# -*- coding: utf-8 -*-
from urllib.parse import urljoin
import scrapy
from scrapy.http import Request
from scrapy.spiders import Spider
import re
from douban.items import DoubanItemclass DbCrawlerSpider(Spider):name = 'db_crawler'def start_requests(self):'''设置起始链接:return: '''url = 'https://movie.douban.com/top250'yield Request(url, callback=self.page_index)def page_index(self, response):'''列表页,获取电影链接和翻页链接:param response: :return: '''for url in response.xpath('//ol[@class="grid_view"]/li/div[@class="item"]/div[2]/div[1]/a/@href').extract():yield Request(url, callback=self.detail_page)next_page = response.xpath('//div[@class="paginator"]/span[@class="next"]/a/@href').extract_first()if next_page:next_page = urljoin(response.url, next_page)yield Request(next_page, callback=self.page_index)def detail_page(self, response):'''详情页,抓取关键字段信息:param response: :return: '''item = DoubanItem()item['title'] = response.xpath('//*[@id="content"]/h1/span/text()').extract_first()item['director'] = response.xpath('//*[@id="info"]/span[1]/span[2]/a/text()').extract_first()item['screenwriter'] = response.xpath('string(//*[@id="info"]/span[2]/span[2])').extract_first()item['actor'] = response.xpath('string(//*[@id="info"]/span[3]/span[2])').extract_first()content = response.xpath('//*[@id="info"]').extract_first()type_find = re.findall(r'<span class="pl">类型:(.*?)<br/?>', content, re.S|re.M)item['type'] = re.sub(r'<.*?>','', type_find[0]).strip()region_find = re.findall(r'<span class="pl">制片国家/地区:(.*?)<br/?>', content, re.S | re.M)item['region'] = re.sub(r'<.*?>','', region_find[0]).strip()lang_find = re.findall(r'<span class="pl">语言:(.*?)<br/?>', content, re.S | re.M)item['lang'] = re.sub(r'<.*?>','', lang_find[0]).strip()date_find = re.findall(r'<span class="pl">上映日期:(.*?)<br/?>', content, re.S | re.M)item['date'] = re.sub(r'<.*?>','', date_find[0]).strip()leng_find = re.findall(r'<span class="pl">片长:(.*?)<br/?>', content, re.S | re.M)item['leng'] = re.sub(r'<.*?>','', leng_find[0]).strip()other_name = re.findall(r'<span class="pl">又名:(.*?)<br/?>', content, re.S | re.M)item['other_name'] = re.sub(r'<.*?>','', other_name[0]).strip()item['point'] = response.xpath('//strong[@class="ll rating_num"]/text()').extract_first().strip()item['introduction'] = response.xpath('//span[@property="v:summary"]/text()').extract_first().strip()yield item
  • 编辑piplines.py文件,把数据存起来
  • 这里面的方法,可以保存起来,以后再scrapy抓取数据保存到mysql数据库里面时,可以直接复制粘贴拿过去直接用,需要的话还可以再添加几个方法。
# -*- coding: utf-8 -*-# Define your item pipelines here
#
# Don't forget to add your pipeline to the ITEM_PIPELINES setting
# See: https://doc.scrapy.org/en/latest/topics/item-pipeline.html
import pymysqlclass DoubanPipeline(object):def __init__(self, settings):'''初始化:param settings: '''self.host = settings.get('SQL_HOST')self.port = settings.get('SQL_PORT')self.user = settings.get('SQL_USER')self.passwd = settings.get('SQL_PASSWD')self.db = settings.get('SQL_DB')self.table = settings.get('TABLE_NAME')self.charset = settings.get('SQL_CHARSET')@classmethoddef from_settings(cls, settings):'''获取settings:param settings: :return: '''return cls(settings)def open_spider(self, spider):'''开启spider时,自动连接数据库:param spider: :return: '''self.conn = pymysql.connect(host=self.host, port=self.port, user=self.user, passwd=self.passwd, db=self.db, charset=self.charset)self.db = self.conn.cursor()def close_spider(self, spider):'''关闭spider时,关闭数据库连接:param spider: :return: '''self.db.close()self.conn.close()def data_save(self, item):'''保存数据,插入到数据库:param item: :return: '''keys = ', '.join(list(item.keys()))values_form = ', '.join(['%s'] * len(list(item.keys())))insert_sql = "insert into `{}`({})values({});".format(self.table, keys, values_form)try:self.db.execute(insert_sql, tuple(item.values()))self.conn.commit()except Exception as e:print(e.args)self.conn.rollback()def select_data(self, item):'''select下电影标题,看是否在数据库中存在,存在返回true,不存在返回false, 用来判重:param item: :return: '''movie_name = item.get('title')columns_name = 'title'select_sql = 'select * from {} where {}="{}";'.format(self.table, columns_name, movie_name)self.db.execute(select_sql)res = self.db.fetchall()if res:return Trueelse:return Falsedef process_item(self, item, spider):'''保存items:param item: :param spider: :return: '''if not self.select_data(item):self.data_save(item)else:print('该条已存在')return item
  • 啊,把测试时候用的run.py文件忘记了,可以在这里写个run文件,不然每次都要到cmd里面去启动,很麻烦
# -*- coding: utf-8 -*-
from scrapy import cmdlinecmdline.execute("scrapy crawl db_crawler".split())

-来看下结果

  • 但是我发现少了6条,只有244条, 翻了下抓取时的记录,发现有几处报错,可以在spider.py文件里面写个异常处理

#总结:

  • 总之,这样一篇简单的scrapy就完成了,不过需要修改的地方还有几个,比如异常处理,其他的有看到的小伙伴可以给点意见
  • 最近打算多学习下scrapy,不然感觉都快忘光了,徐徐渐进吧

Scrapy-豆瓣电影Top250相关推荐

  1. python爬取豆瓣电影top250_【Python3爬虫教程】Scrapy爬取豆瓣电影TOP250

    今天要实现的就是使用是scrapy爬取豆瓣电影TOP250榜单上的电影信息. 步骤如下: 一.爬取单页信息 首先是建立一个scrapy项目,在文件夹中按住shift然后点击鼠标右键,选择在此处打开命令 ...

  2. 03_使用scrapy框架爬取豆瓣电影TOP250

    前言: 本次项目是使用scrapy框架,爬取豆瓣电影TOP250的相关信息.其中涉及到代理IP,随机UA代理,最后将得到的数据保存到mongoDB中.本次爬取的内容实则不难.主要是熟悉scrapy相关 ...

  3. Python 采用Scrapy爬虫框架爬取豆瓣电影top250

    scrapy 简介 在此,默认已经安装好Scrapy,如果没有安装可以到scrapy 官网下载安装. 注意: 在安装Scrapy之前首先需要安装一下python第三方库:(安装方法并不在本文讲解范围, ...

  4. scrapy框架实现豆瓣电影top250

    Scrapy 是用纯 Python 实现一个为了爬取网站数据.提取结构性数据而编写的应用框架,用户只需要定制开发几个模块就可以实现一个网络爬虫程序,其采用了异步通讯的方式可以快速进行数据爬取.在pyt ...

  5. 对豆瓣电影Top250榜单的一些探索性分析

    业余打发时间看电影是个不错的选择,但是如果看了一部无聊糟心的电影就得不偿失了,所以一些电影方面的榜单就出现了,可以为这些选择困难患者提供一个不错的指南,那些是经典是值得看的,而那些电影不值得你浪费一两 ...

  6. python爬取豆瓣电影top250_用Python爬取豆瓣电影TOP250分析

    / 01 / Scrapy 之前了解了pyspider框架的使用,但是就它而言,只能应用于一些简单的爬取. 对于反爬程度高的网站,它就显得力不从心. 那么就轮到Scrapy上场了,目前Python中使 ...

  7. 牛刀小试:利用Python分析豆瓣电影Top250(一)

    使用Scrapy框架抓取豆瓣电影TOP250信息(https://movie.douban.com/top250). 获取影片信息后对数据进行清洗,手动填补遗漏的电影信息等. 整理完毕后具体信息如下 ...

  8. 爬虫——豆瓣电影top250

    爬虫--豆瓣电影top250 无论是动态网页爬虫和静态网页爬虫,实现的思路基 本上都是获取页面 html.页面解析.数据保存或输出.虽然获取页面 html 以及数据保存都 已经封装为通用函数,但依然编 ...

  9. scrapy1.3爬取豆瓣电影top250

    学习<爬虫框架scrapy,爬取豆瓣电影top250>,用scrapy1.3实践,记录学习过程 1 . 新建项目 进入打算存储代码的目录,命令行运行如下语句 scrapy startpro ...

  10. mysql 豆瓣,爬取豆瓣电影Top250并存入Mysql

    最近使用scrapy爬取了豆瓣电影Top250的数据和图片保存到Mysql,给大家分享一下 创建scrapy startproject doubantop250 items.py class Doub ...

最新文章

  1. 如何在FineUIMvc(ASP.NET MVC)视图中绑定多个模型?
  2. 如何高效输出移动app产品原型?
  3. 软件测试需要什么样的思维,你知道软件测试的核心价值是什么吗?为什么我们需要软件测试?...
  4. SPRING IN ACTION 第4版笔记-第三章ADVANCING WIRING-003-@Conditional根据条件生成bean及处理profile...
  5. 直播回放 | 人工智能强化金融风控(附PPT)
  6. python nan_python [吐槽]关于nan类型时遇到的问题
  7. 网页复选框设置只能选一个_男生在密室呆一个月, 只能选手机或者女人, 结果太现实...
  8. feed流和瀑布流_基础知识讲解:什么是feed流?(图文)
  9. python API url 级联生成
  10. ctfshow-WEB-web4
  11. VLAN 间 路由——华为(单臂路由)
  12. Android之仿ele地图定位效果
  13. 阶段5 3.微服务项目【学成在线】_day03 CMS页面管理开发_08-新增页面-前端-Api调用...
  14. 五笔字根表识别码图_五笔字根表
  15. plm服务器 硬件性能,PLM 性能问题
  16. Java毕设项目菜鸟驿站快递分发系统计算机(附源码+系统+数据库+LW)
  17. 海思3516DV300系列HiPQTools工具ISP图像调试_AWB校定
  18. konga 连接postgresql 12+启动异常:error: column r.consrc does not exist
  19. BC26 TCP透传
  20. 美团后台篇中的ReentrantLock

热门文章

  1. MFC 通用对话框之字体对话框
  2. 亚马逊网上书店、巴诺书店最佳畅销书《最后期限》
  3. 计算机主机结构讲解,电脑内部结构图和讲解
  4. MFC的消息处理模式
  5. 【设计模式】简单工厂模式 ( 简介 | 适用场景 | 优缺点 | 代码示例 )
  6. 孤儿进程/僵尸进程/守护进程
  7. 超级外链工具-自动添加外链都有哪些
  8. Struts2详细使用教程
  9. 关于Factory mode test item cannot display的原因
  10. android MTK手机adb remount 失败,如何remont成功?