scrapy爬虫,一直爬,一直爽(豆瓣电影为例子)(学习笔记)

我的scrapy爬虫,一直爬,一直爽

1.python(注意自己安装的版本)

2.lxml

3.Twisted

4.zope.interface

5.PyOpenSSL

6.pywin32

当面对一些包不能用

pip install XXX

的形式安装时,要到whl文件安装whl文件,下载地址https://www.lfd.uci.edu/~gohlke/pythonlibs/#lxml。注意,要找到与你安装的ppython版本一致的文件。通过whl文件安装,首先要安装wheel包。把下载好的whl文件放到python的Lib目录下,最后到cmd下运行

pip install XXX.whl

即可。

MongoDB

1.安装:下载连接https://www.mongodb.com/download-center?jmp=nav#community

2.配置环境变量,把mongodb下的bin的安装目录设置为环境变量。可以打开cmd测试有没有配置好

3.先在mongodb安装文件下找到data文件,并在里边创建db文件,这个文件将是以后存放数据的地方,在cmd在运行以下命令,打开数据库服务器

  #设置db为数据存放路径,注意代码块里边的地址是db文件夹的地址,这个命令是打开数据库服务器的。每次要打开数据库服务器都要运行这条命令。 #在浏览器输入http://localhost:27017/  
#若显示:It looks like you are trying to access MongoDB over HTTP on the native driver port. 表示成功连接  27017是默认本地端

3.下面就可以启动数据库的客户端,由于我们设置了mongodb为环境变量,所以可以在cmd直接输入(注意要保持打开的mongodb数据库端口不能关闭):

mongo  #启动数据库客户端,注意,要先打开数据库服务器后才能打开数据库客户端,数据库客户端是用来对数据进行增删改查的,
MongoDB的基本操作

服务器(serve):一个服务器可以有多个数据库

数据库(database):一个数据库可以多个集合

集合(collection):一个集合可以多个文件,数据库和集合不需要单独创建

文档(document):数据就在文档里,操作也在这里

show dbs #显示所有数据库

use 数据库名 #进入指定数据库

db #显示当前数据库

show collections

1、http://mongovue.software.informer.com/download/ 下载官方mongovue工具(可视化管理工具)


爬虫实例步骤

1.创建爬虫项目

打开cmd,进入所要创建爬虫项目的文件夹,运行以下命令,创建爬虫项目

D:\scrapy>scrapy startproject bouban 

2.进入爬虫项目,创建爬虫文件,爬虫文件命令要包括爬虫名和所爬网站的域名

scrapy genspider douban_spider movie.douban.com #创建爬虫文件,此处包括爬虫文件名和网站域名

3.在代码编辑器(这里选择sublime text)打开创建好的项目文件,编写相关的代码块

##item,item作用是提前设定好需要爬取的变量名
import scrapy
class DoubanItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    serial_number = scrapy.Field()
    movie_name = scrapy.Field()
    # introduce = scrapy.Field()
    # star = scrapy.Field()
    evaluate = scrapy.Field()
    # describe  = scrapy.Field()
    

##setting文件常用设置
USER_AGENT = 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/76.0.3809.132 Safari/537.36'##更该代理,chrome浏览器->F12->F5->top250->header->user_agent,找到替换就行
ROBOTSTXT_OBEY = False##爬虫遵循规则
LOG_LEVEL = 'WARN'##日志显示水平等级
ITEM_PIPELINES = {
     
   'douban.pipelines.DoubanPipeline': 300,
}###运用管道的时候要用到
FEED_EXPORT_ENCODING = 'UTF-8'#用cmd命令输出文件时格式


###spider.py

# -*- coding: utf-8 -*-
import scrapy

import sys
import os
fpath = os.path.abspath(os.path.join(os.path.dirname(__file__),".."))
ffpath = os.path.abspath(os.path.join(fpath,".."))
print(ffpath)
sys.path.append(ffpath)
from douban.items import DoubanItem ##注意是from 项目名.items import XXX。sublimes导入itme类时会显示model错误,原因在于路径的问题。因此必须输入以上几条命令。


class DoubanSpiderSpider(scrapy.Spider):
    name = 'douban_spider'#蜘蛛的名字
    allowed_domains = ['movie.douban.com']#待爬网站域名
    start_urls = ['https://movie.douban.com/top250']#起始网站

    def parse(self, response):
    	# print(response)
        movie_list = response.xpath('//ol[@class="grid_view"]/li')#生成列表,列表每一个元素都是要爬的一个目标对象
        for i_item in movie_list:    #遍历列表
        	douban_item = DoubanItem()#引入item类
        	
        	douban_item['serial_number'] = i_item.xpath('.//div[@class="item"]//em/text()').extract_first()
        	douban_item['movie_name']  = i_item.xpath('.//div[@class="hd"]/a/span[1]/text()').extract()
        	douban_item['evaluate'] = i_item.xpath('.//div[@class="star"]/span[2]/text()').extract_first()
        	yield douban_item  #将爬到的数据返回到item
        
#### 上面只是完成了一页的爬取,下面获取下一页连接
        next_url = response.xpath('//span[@class="next"]/a/@href').extract()#这里可以得到只有一个元素的列表
        if next_url:
        	next_url = next_url[0]#提取,处理唯一的元素
        	yield scrapy.Request('https://movie.douban.com/top250'+ next_url,callback = self.parse)#注意这里self.parse是没有括号的,callback传递需要调用的函数,不是调用函数。加上括号就调用了函数。这里同样需要把下一页的完整连接yield回去,继续进行下一页的爬虫
	        








# extract()   返回选中内容的Unicode字符串,是一个列表形式
# extract_first()   SelectorList专有,返回其中第一个Selector对象调用extract方法。通常SelectorList中只含有一个Selector对象的时候选择调用该方法。extract列表的第一个元素
#re()使用正则表达式来提取选中内容中的某部分。
#举个例子
# selector.xpath('.//b/text()') .extract()  
#[‘价格:99.00元’,‘价格:88.00元’,‘价格:88.00元’]
#selector.xpath('.//b/text()').re('\d+\.\d+')    
#[ '99.00','88.00','88.00']
#re_first()   返回SelectorList对象中的第一个Selector对象调用re方法。
#selector.xpath('.//b/text()').re_first('\d+\.\d+')   # '99.00'
>>> title = response.xpath('//*[@id="post-114638"]/div[1]/h1')
>>> title
[<Selector xpath='//*[@id="post-114638"]/div[1]/h1' data='

能从远程获得乐趣的 Linux 命令

'
>] >>> title.extract() ['

能从远程获得乐趣的 Linux 命令

'
] >>> title.extract()[0] '

能从远程获得乐趣的 Linux 命令

'

由于xpath返回一个selector对象,所以可以接着对其操作:

>>> title.xpath('//div[@class="entry-header"]/h1/text()')
[<Selector xpath='//div[@class="entry-header"]/h1/text()' data='能从远程获得乐趣的 Linux 命令'>]
>>> title.xpath('//div[@class="entry-header"]/h1/text()').extract()
['能从远程获得乐趣的 Linux 命令']
>>> title.xpath('//div[@class="entry-header"]/h1/text()').extract()[0]
'能从远程获得乐趣的 Linux 命令'
>>>

注意text只会获取到标签内的文本,在遇到下一个标签时后面的文本都将被忽略,如:

html代码:

<div class="post-114638 post type-post status-publish format-standard hentry category-it-tech tag-linux odd" id="post-114638">

    
    <div class="entry-header">
        <h1>能从远程获得乐趣的 Linux 命令h1>
    div>

    <div class="entry-meta">
        <p class="entry-meta-hide-on-mobile">
            2019/01/13 ·  <a href="http://blog.jobbole.com/category/it-tech/" rel="category tag">IT技术a>
            ·  <a href="http://blog.jobbole.com/tag/linux/">Linuxa>
        p>
    div>
    

    <div class="entry">div>
    <div class="textwidget">div>
div>

text()获取文本:

>>> response.xpath('//*[@id="post-114638"]/div[2]/p').extract()[0]
''
>>>
>>> response.xpath('//*[@id="post-114638"]/div[2]/p/text()').extract()[0]
'\r\n\r\n            2019/01/13 ·  '
>>>
>>> response.xpath('//*[@id="post-114638"]/div[2]/p/text()').extract()[0].replace('·','').strip()
'2019/01/13'
>>>

4.运行爬虫文件

在cmd中用命令进入到爬虫蜘蛛的父级目录,运行一下命令

D:\scrapy\douban\douban>scrapy crawl douban_spider -o douban.csv FEED_EXPORT_ENCODING = 'UTF-8'  #如果最后编码部分下setting中已经设置好,这里就不用写。若不定义编码方式,可能会出现乱码。若保存的csv文件用excel直接打开会出现中文乱码,因为excel默认打开方式是ASCII码,可以通过选择记事本打开,再另存为的方式解决。

你可能感兴趣的:(学习,scrapy爬虫,豆瓣250,python爬虫)