目的:爬取豆瓣电影(https://movie.douban.com/top250),并将信息(电影标题、信息、评分、简介)保存到本地数据库
分析1: 针对每页(比如首页:https://movie.douban.com/top250?start=0)【start以25的间隔增加】
- 电影标题 response.xpath('//div[@class="info"]//span[@class="title"][1]/text()').extract()
- 电影信息 response.xpath('//div[@class="info"]/div[@class="bd"]/p/text()').extract()
- 评分 response.xpath('//div[@class="info"]//span[@class="rating_num"]/text()').extract()
- 简介 response.xpath('//div[@class="info"]//p[@class="quote"]/span/text()').extract()
分析2: 采用基于spider类的Scrapy框架
- 难点1: 在pipelines.py管道文件中,将爬取的数据保存到mongodb
- 难点2: 在middlewares.py中间件中,设置User-Agent和Proxy
1、cmd中的操作
C:\Users\Administrator\Desktop>scrapy startproject douban C:\Users\Administrator\Desktop>cd douban C:\Users\Administrator\Desktop\douban>scrapy genspider demo movie.douban.com
2、编辑items.py,设置需要保存的数据
from scrapy import Field,Item class DoubanItem(Item): title=Field() #标题 bd=Field() #信息 star=Field() #评分 quote=Field() #简介
3、在demo.py中编辑爬虫文件
import scrapy from douban.items import DoubanItem class DemoSpider(scrapy.Spider): name = 'demo' allowed_domains = ['movie.douban.com'] url='https://movie.douban.com/top250?start=' start=0 start_urls = [url+str(start)] #自己拼接访问的url def parse(self, response): divs=response.xpath('//div[@class="info"]') for div in divs: item=DoubanItem() item['title']=div.xpath('.//span[@class="title"][1]/text()').extract()[0] item['bd']=div.xpath('./div[@class="bd"]/p/text()').extract()[0] item['star']=div.xpath('.//span[@class="rating_num"]/text()').extract()[0] item['quote']=div.xpath('.//p[@class="quote"]/span/text()').extract()[0] yield item if self.start<=225: self.start+=25 yield scrapy.Request(url=self.url+str(self.start),callback=self.parse) #访问新的一页
插入分析难点,所以需要先设置settings.py配置文件,然后再编辑pipelines.py和middlewares.py文件
- 难点1: 在pipelines.py管道文件中,将爬取的数据保存到mongodb
- 难点2: 在middlewares.py中间件中,设置User-Agent和Proxy
4、编辑settings.py配置文件 【只列出修改部分】
#打开middlewares中间件 DOWNLOADER_MIDDLEWARES = { #'douban.middlewares.DoubanDownloaderMiddleware': 543, 'douban.middlewares.RandomUserAgentMiddleware':100, #随机User-Agent 'douban.middlewares.RandomProxyMiddleware':200, #随机代理 } #随机的User-agent USER_AGENT=[ "Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0;", "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.0)", "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1)", "Opera/9.80 (Windows NT 6.1; U; en) Presto/2.8.131 Version/11.11", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; 360SE)", "Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/55.0.2883.87 UBrowser/6.2.4094.1 Safari/537.36", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1)", "Mozilla/5.0 (Linux; U; Android 2.3.7; en-us; Nexus One Build/FRF91) AppleWebKit/533.1 (KHTML, like Gecko) Version/4.0 Mobile Safari/533.1", "Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Avant Browser)", ] #代理 PROXIES=[ {'ip_port':'121.42.140.113:16816','user_passwd':'psy:123456789'}, #私密的IP代理,需要用户名和密码,需要验证 {'ip_port':'182.46.115.77:8118','user_passwd':'123456789'}, #免费的IP代理,不需要用户名和密码,不需要验证 ] #打开pipelines管道文件 ITEM_PIPELINES = { 'douban.pipelines.DoubanPipeline': 300, #将数据保存到MongoDB数据库 } MONGODB_HOST='127.0.0.1' #mongodb主机名 MONGODB_PORT=27017 #mongodb端口号 MONGODB_DBNAME='Douban' #数据库名称 MONGODB_SHEETNAME='movies' #表名称 【MongoDB数据库的设置】
5、编辑pipelines.py文件 将爬取的item数据保存到MongoDB数据库中
此时需要先在cmd中操作:C:\Users\Administrator>mongod --dbpath D:\data\db --port 27017
目的:打开mongodb在27017端口的数据库
一定要执行该步骤,否则数据不能保存到mongodb数据库中,也不能使用MongoDB Compass桌面控制软件
import pymongo from scrapy.conf import settings #导入settings.py中的配置文件 #或者使用 from douban.settings import * class DoubanPipeline(object): def __init__(self): self.host=settings['MONGODB_HOST'] #mongodb主机名 self.port=settings['MONGODB_PORT'] #mongodb端口号 self.dbname=settings['MINGODB_DBNAME'] #数据库名称 self.sheetname=settings['MONGODB_SHEETNAME'] #表名称 client=pymongo.MongoClient(host=self.host,port=self.port) #创建mongodb数据库连接 mydb=client[self.dbname] #指定数据库 self.post=mydb[self.sheetname] #存放数据的数据库表名 def process_item(self,item,spider): data=dict(item) self.post.insert(data) #将数据存入到mongodb数据库中 return item
6、编辑middlewares.py文件,分别随机添加User-Agent和ip代理
import random,base64 from douban.settings import USER_AGENT,PROXIES from scrapy import signals class RandomUserAgentMiddleware(object): #随机的User-Agent def process_item(self,request,spider): useragent=random.choice(USER_AGENT) request.headers.setdefault('User-Agent',useragent) class RandomProxyMiddleware(object): #随机的代理 def process_request(self,request,spider): proxy=random.choice(PROXIES) if proxy['user_passwd'] is None: #没有代理账号验证的代理使用方式 request.meta['proxy']="http://"+proxy['ip_port'] else: #使用代理账户验证的代理使用方式 request.meta['proxy']="http://"+proxy['ip_port'] base64_userpasswd=base64.b64encode(proxy['user_passed']) #对账户密码进行base64编码转换 request.headers['Proxy-Authorization']=base64_userpasswd #对应到代理服务器的信令格式 (代理用户验证)
7、运行
C:\Users\Administrator\Desktop\douban>scrapy crawl demo
此时MongoDB中的‘Douban’数据库中的‘movies’表中出现,且存放爬取的相应信息。