基础Scrapy项目空白版本,直接填细节,进行细节调试后,即可使用(方便!)

首先,电脑上要安装了scrapy
如何安装,可以参考:https://blog.csdn.net/yctjin/article/details/70658811

新建文件夹,shift + 右键,选择在该处打开命令窗口,
键入 scrapy startproject 项目名称
稍等片刻,即可自动生成一个爬虫项目

文件夹结构应该是这样的:
基础Scrapy项目空白版本,直接填细节,进行细节调试后,即可使用(方便!)_第1张图片
我们需要自己手动建立上图中csdnBlog_spider.py。
spider是爬虫爬取后的页面解析等处理的地方

该文件的内容是;
包含了xpath和BeautifulSoup两种解析页面的方式
和简单的‘下一页’操作

# 作者:Voccoo
# 撰写时间:2018年8月27日
# Python版本:3.6.5
# CSDN:https://blog.csdn.net/qq_38044574
#
import scrapy
from bs4 import BeautifulSoup
from csdn_spider.items import CsdnSpiderItem


class CnBlogSpider(scrapy.Spider):
    # 爬虫的名称,用于crawl 启动
    name = 'csdn_spider'
    # 限制爬取地址范围,只能爬取下面地址以内的网页
    allowed_domains = ['cnblogs.com']
    start_urls = [
        '初始url地址'
    ]

    # 爬虫运行开始后会自动调用parse方法
    def parse(self, response):
        # response为自动执行的第一个url后的返回结果
        # 括号内容可以根据自己选择的分析网页工具填写,可以用xpath或者BSoup
        parpers = response.xpath(".//*[@class='day']")  # 返回的是个list集合
        # BSoup
        # soup = BeautifulSoup.get(response.text,'lxml')
        # parper =  soup.find('div',{"class":"day"}) #find返回的事class为day的div下的所有内容
        # find_all,是查询相关条件下的所有有关的内容,返回的事list.
        # get('src') 是获取地址,其他信息以此类推
        # get_text() 获取的是文本内容

        for parper in parpers:
            # 通过遍历,将每个parper中的标题,url,时间和内容通过xpath选择出来,然后通过extract提取,选中【0】第一个
            title = parper.xpath('规则').extract()[0]
            url = parper.xpath('规则').extract()[0]
            time = parper.xpath('规则').extract()[0]
            content = parper.xpath('规则').extract()[0]
            #通过form和import导入item,调用classItem,注意获取的值和需要存入的值要一一对应
            item = CsdnSpiderItem(url=url, title=title, time=time, content = content)
            #将item通过yield进行提交,scrapy会自动匹配相关的字段值
            yield item
        #下一页操作
        #通过分析第一页里的response,得到下一页的url
        next_page =  ''
        #判断next_page有没有值存在
        #如果有,则通过yield scrapy.Request调用该url,callback是回调函数,调用parse函数解析,如果有其他方法,也可调用
        #注意,url只能是一个str参数,不可以是其他类型
        if next_page:
            yield scrapy.Request(url = next_page,callback=self.parse)


'''
启动方法1:
根据启动方式的不同,UserAgent设置的位置也不同
如果是在cmd中启动,我们需要在settings.py中,设置UserAgent的内容,否则,就是scrapy默认头访问,很容易被阻拦
在爬虫的上级文件夹 shift + 鼠标右键,选择’在此处打开命令窗口‘,键入scrapy crawl 爬虫名字 
启动方法2:
如果想在本页面直接启动
需要先引用
from scrapy.crawler import CrawlerProcess
可以使用
if __name__ =='__main__':
    process = scrapy.CrawlerProcess({"User-Agent":"User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1"})

    process.crawl(CnBlogSpider)#括号里是类名
    #或者
    process.crawl('csdn_spider')
    #二者是有些微区别的
    process.start()

还有其他的启动方式,可以自行百度
'''

items.py是数据存储的容器,将spider中通过yield 提交的item包装成结构化数据。
内容是:

# 作者:Voccoo
# 撰写时间:2018年8月27日
# Python版本:3.6.5
# CSDN:https://blog.csdn.net/qq_38044574
#
import scrapy


class CsdnSpiderItem(scrapy.Item):
    # define the fields for your item here like:
    # name = scrapy.Field()
    title = scrapy.Field()
    url = scrapy.Field()
    time = scrapy.Field()
    content = scrapy.Field()

pipeline为数据处理模块:
其中包含了pymysql数据库的插入操作,和写入本地操作。
当与数据库进行交互的时候,一定要进行try,防止脏数据的产生

# -*- coding: utf-8 -*-

# 作者:Voccoo
# 撰写时间:2018年8月27日
# Python版本:3.6.5
# CSDN:https://blog.csdn.net/qq_38044574
#
import json
from scrapy.exceptions import DropItem
import pymysql
#数据处理页面
#可以与数据库交互,也可以写入到本地中

class CsdnSpiderPipeline(object):
    #该方法是只要进入该类就会执行的方法
    def __init__(self):
        self.file = open('parper.json','w+')

        '''
        与mysql数据库进行交互
        1.建立连接
        self.db=pymysql.connect(host='ip',user = '用户名',password = '密码',db='数据库名',charset='utf-8')
        2.获取游标
        self.cursor = db.cursor()


       :return 
       '''
    #pipelines是Crapy框架中必定执行的方法
    def process_item(self, item, spider):
        #在spider中,我们已经将获取到的title等存入到了item中了,在这里可以直接调用item
        if item['title']:
            #判断有没有存在title,存在则将item变成字典类型然后写入到parper.json中
            line = json.dump(dict(item) + '\n')
            self.file.write(line)
            return item
        else:
            #若不存在,将这条数据整个丢掉
            #raise是我们可以自定义触发异常的关键字
            raise DropItem('丢掉 title in %s' % item)



        '''
        与mysql数据库进行交互,记得要在这个部分进行try 操作,防止脏数据的出现
         try:
             3.建立sql语句
             sql = 'insert into 表名 (title,url,times,content) value ({title},{url},{time},{content})'.format(**item)
             4.执行sql语句
             self.cursor.execute(sql)
             #进行插入操作,记得要进行commit
             #或者在打开数据库连接的时候,就设置autocommit=True
             self.db.commit()
        except:
            #进行数据回滚,防止脏数据的出现
            self.db.rollback()
            print('sql执行出错:'+ sql)

        finally:
            5.关闭数据库
            self.cursor.close()
        :return 

       更复杂的增删改查也可以在这个地方进行操作,就看自己的想法了,我这是最基本的
       '''



    #数据处理涉及完毕后,我们需要在settings.py中进行激活,否则不会运行
    #因为你在新建scarpy project的时候,settings中就会内置一些相关的启动内容,但有些内容需要手动启动,
    #因为,框架给屏蔽了,就留取了最基本的几条
    #将下面的内容,在settings.py中,去掉注释
    #300这个数字是指最大运行数量
    # ITEM_PIPELINES = {
    #     'csdn_spider.pipelines.CsdnSpiderPipeline': 300,
    # }

settings是配置信息的地方
在生成项目的时候,就会自动生成很多,但大部分都被屏蔽了,只留下了四条:

BOT_NAME = 'csdn_spider'

SPIDER_MODULES = ['csdn_spider.spiders']
NEWSPIDER_MODULE = 'csdn_spider.spiders'
ROBOTSTXT_OBEY = True 

需要手动开启和设置的呦

#开启pipline
ITEM_PIPELINES = {
   'csdn_spider.pipelines.CsdnSpiderPipeline': 300,
}
#设置访问指定url时的header(伪装)
USER_AGENT = 'User-Agent:Mozilla/5.0 (Windows NT 6.1; rv:2.0.1) Gecko/20100101 Firefox/4.0.1'

middleware.py暂时没有用到,先不提,init也没用到,也不用写。
若想使用,直接复制相关模块的内容到自己新建立的工程下对应模块即可,都有详细的注释。
更改自定义导入文件的名称(大部分不用该)
html数据自定义获取的方式,需要填写(我都没写)
然后运行即可。

谢谢观看。
如果对你有帮助了,帮忙点个赞,谢谢。

你可能感兴趣的:(python学习,pymysql,scrapy,爬虫,数据保存)