scrapy简单操作流程

新建爬虫项目

scrapy startproject 项目名称

创建爬虫文件

scrapy genspider 爬虫文件名称 要爬取的目标url的域(baidu.com)

运行爬虫

scrapy crawl 爬虫名称


以jobble为例:

    1. 创建项目:scrapy startproject jobbleproject
    1. 进入jobbleproject/jobbleproject/spider目录,新建爬虫文件:scrapy genspider jobble jobble.com
    1. 打开item文件:根据目标网站分析需要提取的数据,在item.py文件中添加需要获取的字段
class JobboleItem(scrapy.Item):

    # define the fields for your item here like:
    #标题
    title = scrapy.Field()
    #创建时间
    create_date = scrapy.Field()
    #文章地址
    url = scrapy.Field()
    #id
    url_object_id = scrapy.Field()
    #文章图片
    front_image_url = scrapy.Field()
    #文章图片地址
    front_image_path = scrapy.Field()
    # 点赞数
    praise_nums = scrapy.Field()
    #收藏数
    bookmark_nums = scrapy.Field()
    # 评论数
    comment_nums = scrapy.Field()
    #文章内容
    content = scrapy.Field()
    #标签
    tags = scrapy.Field()
    # 插入数据库语句

  1. 打开 jobboleproject/spider目录里的 jobbole.py,默认增加了下列代码:(也可以自行创建文件并添加以下代码)
class JobboleSpider(scrapy.Spider):

    name = 'jobbole' # 爬虫名称
    allowed_domains = ['jobbole.com'] # url的域
    start_urls = ['http://blog.jobbole.com/all-posts/'] # 目标url(起始URL)

def parse(self, response):
    pass

    1. 在parse方法中做数据的提取(可参考之前介绍的几种提取数据方法,以下介绍如何使用)
def parse(self, response):
    # 获取url
  response.url
# 使用item设置的字段
from jobbleproject.items import JobbleItems
# 
# 使用xpath提取数据,scrapy提前封装好可以直接使用
response.xpath('xpath语法')
# css选择器
response.css('div.a div#q')
# 通过以上方法得到的是Selector类型,用以上方法转化成字符串
response.xpath('xpath语法').extact_first('如果没有提取到数据或数据为空可设置一个默认值') --> 获取一个并且是第一个
 response.css('div.a div#q').extract() -->获取所有,返回一个列表
# 把获取到的数据交给管道做下载等任务
yield response.xpath('....')
# 发起一个请求
 """
            url:设置请求的url地址
            callback=None:设置请求的回调方法
            method='GET'请求方式,默认为get请求
            headers=None,设置请求头,字典类型
            cookies=None,设置cookies信息,模拟用户登录,字典类型
            meta=None:传递参数(字典类型)
            encoding='utf-8':设置编码
            dont_filter=False,是否要去重,默认为False,表示去重
            errback=None,请求失败后的回调
            """
            yield scrapy.Request(firstURL,callback=self.parse_tags_page)

    1. settings文件:设置请求头,UA,全局的请求头,激活管道、cookie、下载中间件,下载延时等等
# 是否遵守robot协议(默认为True表示遵守)
ROBOTSTXT_OBEY = False
# 是否携带cookie值,默认为遵守
COOKIES_ENABLED = False
# UA
DEFAULT_REQUEST_HEADERS = {
#   'Accept': 'text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8',
#   'Accept-Language': 'en',
    'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:64.0) Gecko/20100101 Firefox/64.0'
}
# 下载中间件
DOWNLOADER_MIDDLEWARES = {
    'jobble.middlewares.ChufangDownloaderMiddleware': 543,
}
# 激活管道
ITEM_PIPELINES = {
   'jobble.pipelines.ChufangPipeline': 300,
}
# mysql 数据库的信息
MYSQL_HOST = '127.0.0.1'
MYSQL_USER = 'root'
MYSQL_pwd = 'XXX'
MYSQL_DB = 'jobble'
MYSQL_PORT = 3306
MYSQL_CHARSET = 'utf8'

# 代理
PROXIES = [
    {'ip_port': '61.128.208.94:3128','user_pwd': None},
  {'ip_port': '61.128.208.94:3128','user_pwd': ‘XXX’}
]

# mongodb数据库配置信息
MONGO_HOST = '127.0.0.1'
MONGO_PORT = 27017
MONGO_DB = 'jobble'

    1. 管道piplines:
import scrapy
from jobbleproject.items import JobboleItem
class jobblezprojectPipeline(object):
    def __init__(self):
        """
        初始化方法
        """
        self.client = pymysql.Connect(
            '127.0.0.1','root','XXX','jobble',3306,charset='utf8'
        )
        self.cursor = self.client.cursor()

        # self.mongo_client = pymongo.MongoClient(host='127.0.0.1',port=27017)

    def open_spider(self,spider):
        """
        爬虫启动的时候会调用一次
        :param spider:
        :return:
        """
        print('爬虫开启')

    def process_item(self, item, spider):
        """
        做数据持久化
        这个方法是必须实现的,爬虫文件中的所有ITEM
        都会经过这个方法
        :param item: 爬虫文件传递过来的item对象
        :param spider: 爬虫文件实例化的对象
        :return:
        """

        # mysql数据库

        sql,data = item.get_insert_sql_data(data_dict)
        try:
            # self.cursor.execute(sql,list(data_dict.values()))
            self.cursor.execute(sql, data)
            self.client.commit()
        except Exception as err:
            print(err)
            self.client.rollback()

        # 如果有多个管道文件,一定要注意return,item,
        # 否则下一个管道无法接收到item
        print('经过了管道')
        return item

    def close_spider(self,spider):
        """
        爬虫结束的时候会调用一次
        :param spider:
        :return:
        """
        self.client.close()
        self.cursor.close()
        print('爬虫结束')

mongo
class ChinazprojectPipeline(object):
    def __init__(self,host,port,dbname):
        # 创建连接
        self.mongo_client = pymongo.MongoClient(host=host,port=port)
        # 数据库
        self.db = self.mongo_client[dbname]

    @classmethod
    def from_crawler(cls,crawler):
        """
        MONGO_HOST = '127.0.0.1'
        MONGO_PORT = 27017
        MONGO_DB = 'jobble'
        :param crawler:
        :return:
        """
        host = crawler.settings['MONGO_HOST']
        port = crawler.settings['MONGO_PORT']
        db = crawler.settings['MONGO_DB']
        return cls(host,port,db)

    def process_item(self,item,info):
        """

        :param item:
        :param info:
        :return:
        """
        # 往哪个集合插入
        col_name = item.get_mongo_collectionName()
        col = self.db[col_name]

        dict_data = dict(item)

        try:
            col.insert(dict_data)
            print('数据插入成功')
        except Exception as err:
            print('失败',err)
        return item

    def close_spider(self,spider):
        """
        爬虫结束的时候会调用一次
        :param spider:
        :return:
        """
        self.mongo_client.close()
        print('爬虫结束')

    1. middleware:可设置下载中间件,作用:反爬虫
# 设置UA
class UserAgentDownloadMiddlerware(object):
    def process_request(self, request, spider):
        from fake_useragent import UserAgent
        User_Agent = UserAgent()
        random_ua = User_Agent.random
        if random_ua:
            # print('经过了下载中间件', random_ua)
            request.headers['User-Agent'] = random_ua
#代理
class ProxiesDownloadMiddlerware(object):
    def process_request(self, request, spider):
        import random
        import base64

        proxies = spider.settings['PROXIES']
        proxy = random.choice(proxies)
        if proxy['user_pwd'] is None:
            # 没有代理账户验证的代理使用方式
            request.meta['proxy'] = proxy['ip_port']
        else:
            # 对账户密码进行base64编码
            user_pwd = base64.b64encode(proxy['user_pwd'].encode('utf-8')).decode('utf-8')
            # 对应到代理服务器的信令格式里
            request.headers['Proxy-Authorization'] = 'Basic ' + user_pwd
            request.meta['proxy'] = proxy['ip_port']


©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容